Si vous utilisez GNU find
vous pouvez essayer -execdir
paramètre, par exemple :
find . -type d -execdir realpath "{}" ';'
ou (selon Commentaire de @gniourf_gniourf ):
find . -type d -execdir sh -c 'printf "%s/%s\n" "$PWD" "$0"' {} \;
Remarque : vous pouvez utiliser ${0#./}
au lieu de $0
pour fixer ./
à l'avant.
ou un exemple plus pratique :
find . -name .git -type d -execdir git pull -v ';'
Si vous voulez inclure le répertoire courant, c'est encore plus simple en utilisant -exec
:
find . -type d -exec sh -c 'cd -P -- "{}" && pwd -P' \;
ou en utilisant xargs
:
find . -type d -print0 | xargs -0 -L1 sh -c 'cd "$0" && pwd && echo Do stuff'
Ou un exemple similaire proposé par @gniourf_gniourf :
find . -type d -print0 | while IFS= read -r -d '' file; do
# ...
done
Les exemples ci-dessus prennent en charge les répertoires dont le nom contient des espaces.
Ou en assignant dans un tableau bash :
dirs=($(find . -type d))
for dir in "${dirs[@]}"; do
cd "$dir"
echo $PWD
done
Changement .
à votre nom de dossier spécifique. Si vous n'avez pas besoin d'exécuter récursivement, vous pouvez utiliser : dirs=(*)
à la place. L'exemple ci-dessus ne prend pas en charge les répertoires dont le nom contient des espaces.
Alors que @gniourf_gniourf suggéré, la seule façon correcte de mettre la sortie de find dans un tableau sans utiliser une boucle explicite sera disponible dans Bash 4.4 avec :
mapfile -t -d '' dirs < <(find . -type d -print0)
Ou pas une méthode recommandée (qui implique l'analyse syntaxique de ls
):
ls -d */ | awk '{print $NF}' | xargs -n1 sh -c 'cd $0 && pwd && echo Do stuff'
L'exemple ci-dessus ignore le répertoire actuel (comme demandé par le PO), mais il se casse sur les noms avec les espaces.
Voir aussi :