Shell, boucler sur des directory

Résolu
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. Contributeur
    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
    1. 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. Contributeur
        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
    2. 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. Contributeur
        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. 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. @zipe31Merci. Je viens de voir ton post.
        Super. Merci à vous deux.
        Je clos le sujet !
        Bon WE.
        0
      4. @zipe31Question 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. Contributeur
        @wire lessOui, 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