Jika Anda menggunakan GNU find, Anda dapat mencoba -execdirparameter, misalnya:
find . -type d -execdir realpath "{}" ';'
atau (sesuai komentar @gniourf_gniourf ):
find . -type d -execdir sh -c 'printf "%s/%s\n" "$PWD" "$0"' {} \;
Catatan: Anda bisa menggunakan ${0#./}alih-alih $0memperbaiki ./di depan.
atau contoh yang lebih praktis:
find . -name .git -type d -execdir git pull -v ';'
Jika Anda ingin memasukkan direktori saat ini, itu bahkan lebih sederhana dengan menggunakan -exec:
find . -type d -exec sh -c 'cd -P -- "{}" && pwd -P' \;
atau menggunakan xargs:
find . -type d -print0 | xargs -0 -L1 sh -c 'cd "$0" && pwd && echo Do stuff'
Atau contoh serupa yang disarankan oleh @gniourf_gniourf :
find . -type d -print0 | while IFS= read -r -d '' file; do
# ...
done
Contoh di atas mendukung direktori dengan spasi di namanya.
Atau dengan menetapkan ke dalam bash array:
dirs=($(find . -type d))
for dir in "${dirs[@]}"; do
cd "$dir"
echo $PWD
done
Ubah .nama folder spesifik Anda. Jika Anda tidak perlu menjalankan secara rekursif, Anda dapat menggunakan: dirs=(*)sebagai gantinya. Contoh di atas tidak mendukung direktori dengan spasi di namanya.
Jadi seperti yang disarankan @gniourf_gniourf , satu-satunya cara yang tepat untuk meletakkan output find dalam array tanpa menggunakan loop eksplisit akan tersedia di Bash 4.4 dengan:
mapfile -t -d '' dirs < <(find . -type d -print0)
Atau bukan cara yang disarankan (yang melibatkan penguraianls ):
ls -d */ | awk '{print $NF}' | xargs -n1 sh -c 'cd $0 && pwd && echo Do stuff'
Contoh di atas akan mengabaikan dir saat ini (seperti yang diminta oleh OP), tetapi itu akan merusak nama dengan spasi.
Lihat juga:
cd "$d"akan lebih baik karena transfer ke situasi di mana wildcard tidak cocok dengan file yang namanya berisi meta karakter spasi dan / atau shell.