Shell, boucler sur des directory

Résolu/Fermé
wire less Messages postés 210 Date d'inscription lundi 5 octobre 2009 Statut Membre Dernière intervention 29 août 2018 - 1 déc. 2017 à 09:59
UnGnU Messages postés 1158 Date d'inscription lundi 2 mai 2016 Statut Contributeur Dernière intervention 22 décembre 2020 - 5 déc. 2017 à 07:44
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.


A voir également:

3 réponses

UnGnU Messages postés 1158 Date d'inscription lundi 2 mai 2016 Statut Contributeur Dernière intervention 22 décembre 2020 157
1 déc. 2017 à 10:39
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
wire less Messages postés 210 Date d'inscription lundi 5 octobre 2009 Statut Membre Dernière intervention 29 août 2018 5
1 déc. 2017 à 11:34
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
UnGnU Messages postés 1158 Date d'inscription lundi 2 mai 2016 Statut Contributeur Dernière intervention 22 décembre 2020 157
1 déc. 2017 à 12:24
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
wire less Messages postés 210 Date d'inscription lundi 5 octobre 2009 Statut Membre Dernière intervention 29 août 2018 5
1 déc. 2017 à 16:31
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
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
1 déc. 2017 à 16:47
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
wire less Messages postés 210 Date d'inscription lundi 5 octobre 2009 Statut Membre Dernière intervention 29 août 2018 5
1 déc. 2017 à 16:58
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
wire less Messages postés 210 Date d'inscription lundi 5 octobre 2009 Statut Membre Dernière intervention 29 août 2018 5 > zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021
1 déc. 2017 à 21:43
Merci. Je viens de voir ton post.
Super. Merci à vous deux.
Je clos le sujet !
Bon WE.
0
wire less Messages postés 210 Date d'inscription lundi 5 octobre 2009 Statut Membre Dernière intervention 29 août 2018 5 > zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021
4 déc. 2017 à 13:59
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
UnGnU Messages postés 1158 Date d'inscription lundi 2 mai 2016 Statut Contributeur Dernière intervention 22 décembre 2020 157 > wire less Messages postés 210 Date d'inscription lundi 5 octobre 2009 Statut Membre Dernière intervention 29 août 2018
4 déc. 2017 à 14:06
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