IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Boucle pour remplacer un fichier sous un répertoire avec sous-répertoires


Sujet :

Shell et commandes GNU

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2008
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 38
    Points : 12
    Points
    12
    Par défaut Boucle pour remplacer un fichier sous un répertoire avec sous-répertoires
    Salut les amis,

    j'ai besoin de votre aide.

    Sous Linux J'ai un dossier local "Dossier1" sous /home/<username>/... qui contient plusieurs sous-dossiers (sous-dossier1, sous-dossier2, sous-dossier3, ...., sous-dossier100)
    tous les sous-dossiers contiennent un dossier nommé "Lib" et sous ce dossier "Lib" il y a un seul fichier nommé "Text.txt".

    Comment, en utilisant une boucle, puis-je faire pour remplacer tous les fichiers "Text.txt" avec un meme fichier "Text2" qui se trouve sur un lecteur réseau?

    Sous Windows j'utilise ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for /F "delims=;" %%f in ('dir /S /B *Text.txt') do copy "P:\Folder\Text2.txt" "%%f" /Y
    Merci d'avance pour votre aide!

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 595
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 595
    Points : 19 480
    Points
    19 480
    Par défaut
    Bonjour,

    c'est obligatoire la boucle ?

    parce qu'il y a d'autres moyens, à base de xargs, ou de find.

  3. #3
    Membre à l'essai
    Inscrit en
    Mars 2008
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 38
    Points : 12
    Points
    12
    Par défaut
    Salut N_BaH,

    merci pour ta reponse, non la bouce c'est pas obligatoire.

    comment puis-je utiliser xargs, ou find dans mon cas?

    merci d'avance!

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 595
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 595
    Points : 19 480
    Points
    19 480
    Par défaut
    tu paramètres find pour qu'il trouve tous les fichiers text.txt sous la racine des sous-répertoires,
    puis tu lui ajoutes l'option -exec pour qu'il exécute cp sur chaque sous-répertoire.

  5. #5
    Membre à l'essai
    Inscrit en
    Mars 2008
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 38
    Points : 12
    Points
    12
    Par défaut
    merci beaucoup, donc je dois juste trouver la bonne syntaxe à utiliser.

  6. #6
    Membre à l'essai
    Inscrit en
    Mars 2008
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 38
    Points : 12
    Points
    12
    Par défaut
    re, bon j'ai passé toute la journée à chercher une solution mais sans résultat. Tout le monde ne parle que de "Chercher et Remplacer une chaîne de texte dans plusieurs fichiers"
    apparament c'est trés compliqué sous Linux.

    En tout cas merci N_BaH pour tes réponses!

    Bonne soirée

  7. #7
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 595
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 595
    Points : 19 480
    Points
    19 480
    Par défaut
    j'aurais peut-être dû te mettre la page man de find ... ?
    c'est le reflexe à acquérir : quand on te donne une commande, tu ouvres la page man

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find répertoireSource -type f -name "text.txt" -exec echo "cp chemin/fichier {}" \;

  8. #8
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 969
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 969
    Points : 15 436
    Points
    15 436
    Par défaut
    Salut salut,

    Citation Envoyé par N_BaH Voir le message
    Bonjour,

    c'est obligatoire la boucle ?

    parce qu'il y a d'autres moyens, à base de xargs, ou de find.
    je pinaille, mais c'est utiliser la boucle (qui me semble obligatoire, je ne vois pas comment faire sans) implémentée dans find, non ?

    Comme je suis curieux, j'ai jeté un œil dans find.c, (dans findutils-4.4.2) et on y trouve ça (trèèèèèèès condensé et raccourci, mais c'est l'idée) :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    static void
    process_dir (char *pathname, char *name, int pathlen, const struct stat *statp, char *parent)
    {
        unsigned int idx;		/* Which entry are we on? */
        register char *namep;	/* Current point in `name_space'. */
        char *cur_path;		/* Full path of each file to process. */
        char *cur_name;		/* Base name of each file to process. */
     
        for (idx=0; idx < dirinfo->size; ++idx)
        {
    	namep = dirinfo->entries[idx].name;
    	process_path (cur_path, cur_name, false, pathname, mode);
        }
    }

  9. #9
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 276
    Points : 13 553
    Points
    13 553
    Par défaut
    Bonjour,

    Citation Envoyé par N_BaH Voir le message
    j'aurais peut-être dû te mettre la page man de find ... ?
    c'est le reflexe à acquérir : quand on te donne une commande, tu ouvres la page man

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find répertoireSource -type f -name "text.txt" -exec echo "cp chemin/fichier {}" \;
    Le 'echo' est une protection pour empêcher l'exécution de la copie. Enlève le si la commande correspond à ton besoin.
    Le {} symbolise le fichier trouvé par find.

  10. #10
    Membre à l'essai
    Inscrit en
    Mars 2008
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 38
    Points : 12
    Points
    12
    Par défaut
    Salut tout le monde,

    @N_BaH: merci pour ton aide!
    @Flodelarab: tu as Raison, ca a trés bien fonctionné sans le echo :-D

    Probleme résolu et bon Weekend à tous!

Discussions similaires

  1. [Débutant] Boucle pour renommer plusieurs fichiers aux noms DIFFERENTS
    Par Bulle_ dans le forum MATLAB
    Réponses: 2
    Dernier message: 27/03/2010, 21h04
  2. Réponses: 1
    Dernier message: 04/02/2010, 21h41
  3. boucle pour renommer un fichier
    Par grego.. dans le forum Langage
    Réponses: 3
    Dernier message: 21/07/2009, 20h05
  4. [POO] script pour remplacer un fichier image par un fichier flash
    Par tomguiss dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 13/12/2008, 14h03
  5. Boucle pour remplacer des mots ds un fichiers
    Par dinozo13 dans le forum Shell et commandes GNU
    Réponses: 0
    Dernier message: 21/07/2008, 15h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo