Jika Anda menggunakan GNU find
, Anda dapat mencoba -execdir
parameter, 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 $0
memperbaiki ./
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.