GNU kullanıyorsanız find
, -execdir
parametreyi deneyebilirsiniz , örneğin:
find . -type d -execdir realpath "{}" ';'
veya ( @gniourf_gniourf yorumuna göre ):
find . -type d -execdir sh -c 'printf "%s/%s\n" "$PWD" "$0"' {} \;
Not: Önde sabitlemek ${0#./}
yerine kullanabilirsiniz .$0
./
veya daha pratik bir örnek:
find . -name .git -type d -execdir git pull -v ';'
Geçerli dizini eklemek istiyorsanız, aşağıdakileri kullanarak daha da basittir -exec
:
find . -type d -exec sh -c 'cd -P -- "{}" && pwd -P' \;
veya kullanarak xargs
:
find . -type d -print0 | xargs -0 -L1 sh -c 'cd "$0" && pwd && echo Do stuff'
Veya @gniourf_gniourf tarafından önerilen benzer bir örnek :
find . -type d -print0 | while IFS= read -r -d '' file; do
# ...
done
Yukarıdaki örnekler adlarında boşluk bulunan dizinleri destekler.
Veya bash dizisine atayarak:
dirs=($(find . -type d))
for dir in "${dirs[@]}"; do
cd "$dir"
echo $PWD
done
Değişim .
özel klasör adının. Yinelemeli olarak çalıştırmanız gerekmiyorsa, dirs=(*)
bunun yerine şunu kullanabilirsiniz:. Yukarıdaki örnek, adında boşluk bulunan dizinleri desteklemez.
@Gniourf_gniourf'un önerdiği gibi, bulgu çıktısını açık bir döngü kullanmadan bir diziye koymanın tek uygun yolu Bash 4.4'te şu şekilde kullanılabilir:
mapfile -t -d '' dirs < <(find . -type d -print0)
Veya önerilen bir yol değil ( ayrıştırmayı içerirls
):
ls -d */ | awk '{print $NF}' | xargs -n1 sh -c 'cd $0 && pwd && echo Do stuff'
Yukarıdaki örnek, (OP tarafından istendiği gibi) geçerli dizini yok sayar, ancak boşluklu isimleri keser.
Ayrıca bakınız:
cd "$d"
joker karakterin adları boşluk ve / veya kabuk metakarakterleri içeren dosyalarla eşleştiği durumlara aktarılması daha iyi olur.