Якщо ви використовуєте 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 запропонував, єдиний правильний спосіб розмістити вихід знаходження в масиві без використання явного циклу буде доступний у 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'
Вищенаведений приклад ігнорує поточний dir (як вимагає ОП), але він порушить імена з пробілами.
Дивитися також:
cd "$d"
було б краще, оскільки він передає ситуацію, коли підстановочний код відповідає файлам, імена яких містять пробіли та / або метахарактеристики оболонки.