Shell, boucler sur des directory

Résolu
wire less Messages postés 247 Date d'inscription   Statut Membre Dernière intervention   -  
UnGnU Messages postés 1468 Statut Contributeur -
Bonjour,
Je me suis fais un script pour parcourir des répertoires et faire une certaine action.

C'est toujours la même action, il y a juste le nom des répertoires qui changes
Repertoire_1
Repertoire_2
Repertoire_Toto
Repertoire_Jacques
Repertoire_5

Du coup, je faire désespérément comment faire une boucle sur des noms de répertoire !!

Je sais pas ... Est-ce qu'il est possible en shell de stoker les différents nom de répertoire dans une liste, et ensuite de les parcourir ?

Genre :
Liste = [Repertoire_1 ; Repertoire_2 ; Repertoire_Toto ; Repertoire_Jacques ; Repertoire_5]

For i in Liste
cd Liste(i)
echo(Salut !)
Mon_Traitement
cd ..
Next

J'ai l'impression que c'est pas si simple que ça à faire en shell !

Merci.

3 réponses

  1. UnGnU Messages postés 1468 Statut Contributeur 158
     
    Salut,

    Une façon de faire :
    $ cat liste.txt
    Repertoire_1
    Repertoire_2
    Repertoire_Toto
    Repertoire_Jacques
    Repertoire_5

    $ while read i; do echo "Répertoire : ${i}"; done < liste.txt
    Répertoire : Repertoire_1
    Répertoire : Repertoire_2
    Répertoire : Repertoire_Toto
    Répertoire : Repertoire_Jacques
    Répertoire : Repertoire_5


    ;-))
    0
  2. wire less Messages postés 247 Date d'inscription   Statut Membre Dernière intervention   5
     
    Ok !!

    Bon, je suis un boulet ... et j'ai compris que le shell c'est quand même bien particulier !!

    Donc en gros mon script va ressembler à ça ? :

    #!/bin/bash
    #script de parcours de repertoire :
    
    $ cat liste.txt
    Repertoire_1
    Repertoire_2
    Repertoire_Toto
    Repertoire_Jacques
    Repertoire_5
    
    $ while read i; do
    cd ${i}
    echo "je suis dans le repertoire :"
    pwd
    Mon_Traitement 
    cd ..
    done < liste.txt
    
    
    0
    1. UnGnU Messages postés 1468 Statut Contributeur 158
       
      Oui. A condition toutefois que les répertoires listés soient tous présents dans le répertoire d'où est lancé le script.
      0
  3. wire less Messages postés 247 Date d'inscription   Statut Membre Dernière intervention   5
     
    Hey hey !! ça marche pô

    #!/bin/bash
    #script de parcours de repertoire :
    
    $ cat liste.txt
    Repertoire_1
    Repertoire_2
    Repertoire_Toto
    Repertoire_Jacques
    Repertoire_5
    
    
    $ while read i; do
    cd ${i}
    echo "je suis dans le repertoire :"
    pwd
    cd ..
    done < liste.txt


    J'execute mon script :

    bash New_Laucher.sh

    Et j'ai les erreurs suivantes !

    New_Laucher.sh: ligne 4: $ : commande introuvable
    New_Laucher.sh: ligne 5: Repertoire_1 : est un dossier 
    New_Laucher.sh: ligne 6: Repertoire_2 : est un dossier
    New_Laucher.sh: ligne 7: Repertoire_Toto : est un dossier
    New_Laucher.sh: ligne 8: Repertoire_Jacques : est un dossier
    New_Laucher.sh: ligne 9: Repertoire_5 : est un dossier
    New_Laucher.sh: ligne 12: erreur de syntaxe près du symbole inattendu « do »
    New_Laucher.sh: ligne 12: `$ while read i; do'


    T'as une idée ?
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Salut,

      Dans l'exemple donné, le "$" symbolise le prompt, et de ce fait n'est pas a tapé dans ton script ;-\

      #!/bin/bash
      #script de parcours de repertoire :
      
      cat liste.txt
      Repertoire_1
      Repertoire_2
      Repertoire_Toto
      Repertoire_Jacques
      Repertoire_5
      
      
      while read i; do
      cd ${i}
      echo "je suis dans le repertoire :"
      pwd
      cd ..
      done < liste.txt

      Sans compter que la commande
      cat liste.txt
      n'est là que pour montrer le contenu du fichier, donc elle n'est pas indispensable dans ton script ;-)

      #!/bin/bash
      #script de parcours de repertoire :
      
      while read i; do
      cd ${i}
      echo "je suis dans le repertoire :"
      pwd
      cd ..
      done < liste.txt
      0
    2. wire less Messages postés 247 Date d'inscription   Statut Membre Dernière intervention   5
       
      Bon ok.
      ça marche, mais tu avais mal expliqué !!

      (Je plaisante bien sur ... Mais je t'avais pourtant dis que j'étais un boulet !!
      Fallait p't'être préciser gros gros boulet...)

      Donc en gros ...
      $
      , ça c'est le prompteur, il faut pas l'écrire dans le script.

      j'ai crée un fichier avec :
      touch liste.txt


      dedans j'y ai écrit :
      Repertoire_1
      Repertoire_2
      Repertoire_Toto
      Repertoire_Jacques
      Repertoire_5


      ensuite j'ai fais un script shell :
      touch Laucher.sh

      Dedans j'y ai mis :

      while read i; do
      cd ${i}
      echo "je suis dans le repertoire :"
      pwd
      cd ..
      done < liste.txt

      je l’exécute
      bash Laucher.sh
      :

      Et j'ai bien eu le résultat :
      je suis dans le repertoire :
      Repertoire_1
      je suis dans le repertoire :
      Repertoire_2
      je suis dans le repertoire :
      Repertoire_Toto
      je suis dans le repertoire :
      Repertoire_Jacques
      je suis dans le repertoire :
      Repertoire_5


      Voila !
      Merci tout le monde
      0
    3. wire less Messages postés 247 Date d'inscription   Statut Membre Dernière intervention   5 > zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention  
       
      Merci. Je viens de voir ton post.
      Super. Merci à vous deux.
      Je clos le sujet !
      Bon WE.
      0
    4. wire less Messages postés 247 Date d'inscription   Statut Membre Dernière intervention   5 > zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention  
       
      Question subsidiaire :

      j'ai bien ma liste de fichier dans liste.txt :
      Repertoire_1
      Repertoire_2
      Repertoire_Toto
      Repertoire_Jacques
      Repertoire_5


      j'arrive bien à parcourir cette liste grace à la commande :

      $ while read i; do echo "Répertoire : ${i}"; done < liste.txt


      D'où ma question :

      Existe-t-il un moyen de sauter une des lignes de ma liste, par exemple en commentant une ligne : Est-ce qu'il est possible de faire quelque chose qui ressemblerai à ça par exemple ?

      Repertoire_1
      Repertoire_2
      #Repertoire_Toto
      Repertoire_Jacques
      Repertoire_5
      0
    5. UnGnU Messages postés 1468 Statut Contributeur 158 > wire less Messages postés 247 Date d'inscription   Statut Membre Dernière intervention  
       
      Oui, mais il faudra rajouter une condition avant de traiter chaque ligne.
      Par exemple tester que la ligne ne commence pas par un croisillon pour appliquer la commande qui suit.

      Où supprimer lesdites lignes (celles commentées) de la lecture du fichier (avec sed par exemple) :

      $ while read i; do echo "Répertoire : ${i}"; done < <(sed '/^#/d' liste.txt)
      Répertoire : Repertoire_1
      Répertoire : Repertoire_2
      Répertoire : Repertoire_Jacques
      Répertoire : Repertoire_5
      0