Jeśli używasz GNU find
, możesz wypróbować -execdir
parametr, np:
find . -type d -execdir realpath "{}" ';'
lub (zgodnie z komentarzem @gniourf_gniourf ):
find . -type d -execdir sh -c 'printf "%s/%s\n" "$PWD" "$0"' {} \;
Uwaga: można użyć ${0#./}
zamiast $0
mocowania ./
z przodu.
lub bardziej praktyczny przykład:
find . -name .git -type d -execdir git pull -v ';'
Jeśli chcesz dołączyć bieżący katalog, jest to jeszcze prostsze, używając -exec
:
find . -type d -exec sh -c 'cd -P -- "{}" && pwd -P' \;
lub używając xargs
:
find . -type d -print0 | xargs -0 -L1 sh -c 'cd "$0" && pwd && echo Do stuff'
Lub podobny przykład sugerowany przez @gniourf_gniourf :
find . -type d -print0 | while IFS= read -r -d '' file; do
# ...
done
Powyższe przykłady obsługują katalogi ze spacjami w nazwie.
Lub przypisując do tablicy bash:
dirs=($(find . -type d))
for dir in "${dirs[@]}"; do
cd "$dir"
echo $PWD
done
Zmień .
na określoną nazwę folderu. Jeśli nie potrzebujesz uruchamiać rekurencyjnie, możesz użyć: dirs=(*)
zamiast. Powyższy przykład nie obsługuje katalogów ze spacjami w nazwie.
Tak więc, jak zasugerował @gniourf_gniourf , jedyny właściwy sposób umieszczenia wyniku find w tablicy bez użycia jawnej pętli będzie dostępny w Bash 4.4 z:
mapfile -t -d '' dirs < <(find . -type d -print0)
Lub nie jest to zalecany sposób (który obejmuje analizęls
):
ls -d */ | awk '{print $NF}' | xargs -n1 sh -c 'cd $0 && pwd && echo Do stuff'
Powyższy przykład zignorowałby bieżący katalog (zgodnie z żądaniem OP), ale zepsuje nazwy ze spacjami.
Zobacz też:
cd "$d"
byłoby lepsze, ponieważ przenosi się do sytuacji, w których symbol wieloznaczny pasuje do plików, których nazwy zawierają białe spacje i / lub metaznaki powłoki.