Se stai usando GNU find
, puoi provare il -execdir
parametro, ad esempio:
find . -type d -execdir realpath "{}" ';'
oppure (come da commento su @gniourf_gniourf ):
find . -type d -execdir sh -c 'printf "%s/%s\n" "$PWD" "$0"' {} \;
Nota: è possibile utilizzare ${0#./}
invece di $0
risolvere ./
nella parte anteriore.
o esempio più pratico:
find . -name .git -type d -execdir git pull -v ';'
Se vuoi includere la directory corrente, è ancora più semplice usando -exec
:
find . -type d -exec sh -c 'cd -P -- "{}" && pwd -P' \;
o usando xargs
:
find . -type d -print0 | xargs -0 -L1 sh -c 'cd "$0" && pwd && echo Do stuff'
O esempio simile suggerito da @gniourf_gniourf :
find . -type d -print0 | while IFS= read -r -d '' file; do
# ...
done
Gli esempi sopra supportano le directory con spazi nel loro nome.
O assegnando in array bash:
dirs=($(find . -type d))
for dir in "${dirs[@]}"; do
cd "$dir"
echo $PWD
done
Passare .
al nome della cartella specifica. Se non è necessario eseguire ricorsivamente, è possibile utilizzare: dirs=(*)
invece. L'esempio sopra non supporta le directory con spazi nel nome.
Quindi, come suggerito da @gniourf_gniourf , l'unico modo corretto per mettere l'output di find in un array senza usare un ciclo esplicito sarà disponibile in Bash 4.4 con:
mapfile -t -d '' dirs < <(find . -type d -print0)
O non un modo raccomandato (che prevede l' analisi dils
):
ls -d */ | awk '{print $NF}' | xargs -n1 sh -c 'cd $0 && pwd && echo Do stuff'
L'esempio sopra ignorerebbe la directory corrente (come richiesto dall'OP), ma si spezzerebbe sui nomi con gli spazi.
Guarda anche:
cd "$d"
sarebbe meglio in quanto trasferisce a situazioni in cui il carattere jolly corrisponde a file i cui nomi contengono spazi bianchi e / o metacaratteri di shell.