214 votes

Bash: pour chaque répertoire

Je suis en train de travailler sur un script, qui doit effectuer une action dans chaque sous-répertoire d'un dossier spécifique.

Quel est le moyen le plus efficace d'écrire?

310voto

kanaka Points 23143

Une version qui évite de créer un sous-processus:

for D in *; do
    if [ -d "${D}" ]; then
        echo "${D}"   # your processing here
    fi
done

Ou, si votre action est une commande unique, c'est plus concis:

for D in *; do [ -d "${D}" ] && my_command; done

Ou une version plus concise (merci @enzotib). Notez que dans cette version, chaque valeur de D auront une barre oblique:

for D in */; do my_command; done

186voto

Mike Clark Points 4468
for D in `find . -type d`
do
    //Do whatever you need with D
done

14voto

Sriram Murali Points 1015

Handy one-liners

for D in *; do echo $D; done

for D in *; do echo $D; find $D -type f| wc -l; done

10voto

Paul Tomblin Points 83687

find . -type d -print0 | xargs -0 -n 1 my_command

7voto

Dennis Williamson Points 105818

Cela va créer un shell interne est exécuté (ce qui signifie que les valeurs des variables seront perdus lors de l' while boucle):

find . -type d | while read -r dir
do
    something
done

Ce ne sera pas:

while read -r dir
do
    something
done < <(find . -type d)

Soit on va travailler si il y a des espaces dans les noms de répertoires.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X