Não gere nomes de arquivos com uma substituição de comando: isso será interrompido se os nomes dos arquivos contiverem espaço em branco ou \[?*
.
Com o bash ≥4, ksh93 ou zsh, é possível evitar a maioria dos usos de find
que usam apenas -type d
ou -name …
usando predicados **
glob para corresponder subdiretórios em qualquer profundidade. No bash, execute shopt -s globstar
primeiro. Em ksh, execute set -o globstar
primeiro.
for dir in **/; do …; done
Portavelmente ou, nos casos em que você precisar de mais, use find … -exec … +
ou find … -print0 | xargs -0 …
. Essa abordagem tem o benefício adicional de executar find
um pouco em paralelo com a ação nos arquivos, embora isso só se torne verdade para árvores de diretório grandes (pelo menos milhares de arquivos correspondentes). Você pode fazer com que find
ou xargs
executem um shell se precisar fazer mais do que executar um comando.
find -type d -exec sh -c 'for x in "$@"; do echo "$x"; done' _ {} +
(Esse _
é $0
no fragmento do shell, que não usamos.)