Если вы используете GNU find
, вы можете попробовать -execdir
параметр, например:
find . -type d -execdir realpath "{}" ';'
или (согласно комментарию @gniourf_gniourf ):
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), но он будет разбит на имена с пробелами.
Смотрите также:
cd "$d"
было бы лучше, если бы он переносился в ситуации, когда подстановочный знак действительно соответствует файлам, имена которых содержат пробелы и / или метасимволы оболочки.