Se você estiver usando o GNU find
, pode tentar o -execdir
parâmetro, por exemplo:
find . -type d -execdir realpath "{}" ';'
ou (conforme comentário do @gniourf_gniourf ):
find . -type d -execdir sh -c 'printf "%s/%s\n" "$PWD" "$0"' {} \;
Nota: Você pode usar em ${0#./}
vez de $0
corrigir ./
na frente.
ou exemplo mais prático:
find . -name .git -type d -execdir git pull -v ';'
Se você deseja incluir o diretório atual, é ainda mais simples usando -exec
:
find . -type d -exec sh -c 'cd -P -- "{}" && pwd -P' \;
ou usando xargs
:
find . -type d -print0 | xargs -0 -L1 sh -c 'cd "$0" && pwd && echo Do stuff'
Ou exemplo semelhante sugerido por @gniourf_gniourf :
find . -type d -print0 | while IFS= read -r -d '' file; do
# ...
done
Os exemplos acima suportam diretórios com espaços em seus nomes.
Ou atribuindo ao array bash:
dirs=($(find . -type d))
for dir in "${dirs[@]}"; do
cd "$dir"
echo $PWD
done
Mude .
para o nome da sua pasta específica. Se você não precisa executar de forma recursiva, você pode usar: dirs=(*)
em vez. O exemplo acima não suporta diretórios com espaços no nome.
Portanto, como sugeriu @gniourf_gniourf , a única maneira adequada de colocar a saída de find em uma matriz sem usar um loop explícito estará disponível no Bash 4.4 com:
mapfile -t -d '' dirs < <(find . -type d -print0)
Ou não é uma maneira recomendada (que envolve a análise dels
):
ls -d */ | awk '{print $NF}' | xargs -n1 sh -c 'cd $0 && pwd && echo Do stuff'
O exemplo acima ignoraria o diretório atual (conforme solicitado pelo OP), mas quebraria os nomes com os espaços.
Veja também:
cd "$d"
seria melhor, pois ele é transferido para situações em que o curinga corresponde a arquivos cujos nomes contêm metacaracteres de espaço em branco e / ou shell.