Si vous utilisez GNU find
, vous pouvez essayer des -execdir
paramètres, par exemple:
find . -type d -execdir realpath "{}" ';'
ou (selon le commentaire @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 souhaitez 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 suggéré 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 avec des espaces dans leur nom.
Ou en affectant dans un tableau bash:
dirs=($(find . -type d))
for dir in "${dirs[@]}"; do
cd "$dir"
echo $PWD
done
Modifiez le nom .
de votre dossier spécifique. Si vous n'avez pas besoin d'exécuter récursivement, vous pouvez utiliser: à la dirs=(*)
place. L'exemple ci-dessus ne prend pas en charge les répertoires avec des espaces dans le nom.
Ainsi, comme @gniourf_gniourf l'a suggéré, la seule façon correcte de mettre la sortie de find dans un tableau sans utiliser de 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 dels
):
ls -d */ | awk '{print $NF}' | xargs -n1 sh -c 'cd $0 && pwd && echo Do stuff'
L'exemple ci-dessus ignorerait le répertoire actuel (comme demandé par OP), mais il cassera sur les noms avec des espaces.
Voir également:
cd "$d"
serait mieux en ce sens qu'il transfère vers des situations où le caractère générique correspond aux fichiers dont les noms contiennent des espaces et / ou des métacaractères shell.