Если вы используете GNU find
, вы можете попробовать -execdir
параметр, например ::
find . -type d -execdir realpath "{}" ';'
или (согласно @ gniourf_gniourf comment ):
find . -type d -execdir sh -c 'printf "%s/%s\n" "$PWD" "$0"' {} \;
Примечание: Вы можете использовать ${0#./}
вместо $0
, чтобы зафиксировать ./
спереди.
или более практический пример:
find . -name .git -type d -execdir git pull -v ';'
Если вы хотите включить текущий каталог, с помощью -exec
:
еще проще
find . -type d -exec sh -c 'cd -P -- "{}" && pwd -P' \;
или используя xargs
:
find . -type d -print0 | xargs -0 -L1 sh -c 'cd "$0" && pwd && echo Do stuff'
Или аналогичный пример, предложенный @ gniourf_gniourf :
find . -type d -print0 | while IFS= read -r -d '' file; do
# ...
done
Приведенные выше примеры поддерживают каталоги с пробелами в имени.
Или присваивая массиву bash:
dirs=($(find . -type d))
for dir in "${dirs[@]}"; do
cd "$dir"
echo $PWD
done
Измените .
на свое имя папки. Если вам не нужно запускать рекурсивно, вы можете использовать: dirs=(*)
вместо этого. Приведенный выше пример не поддерживает каталоги с пробелами в имени.
Таким образом, как предложено @ gniourf_gniourf , единственный правильный способ поместить вывод find в массив без использования явного цикла будет доступен в Bash 4.4 с:
mapfile -t -d '' dirs < <(find . -type d -print0)
Или не рекомендуется (который включает разбор ls
):
ls -d */ | awk '{print $NF}' | xargs -n1 sh -c 'cd $0 && pwd && echo Do stuff'
В приведенном выше примере будет игнорироваться текущий каталог (по запросу OP), но он будет разбиваться на имена с пробелами.
Смотри также: