A diretiva for f in $(find .) divide a lista de elementos para iterar pelo espaço. Em um shell moderno, como zsh, sinalizadores de expansão poderiam ser usados.
for f in "${(@f)$(find .)}" ; do echo "$f" ; done
Permanecendo com bash , podemos trabalhar em torno deste como mencionado em outra pergunta modificando o separador de entrada, o caractere usado para dividir elementos, temporariamente, ao atribuir os resultados de find a uma variável. Desativar o gobbing pelo tempo evita a expansão de caracteres curinga, como * neles.
set -f # Disable globbing.
IFS=$(echo -e 'find . -print0 | xargs -0 -n1 echo
') files=( $(find . -print0) ) # Read newline separated files into an array.
for f in ${files[@]}; do echo $f; done
set +f # Reenable globbing.
Mas isso apenas muda o problema, agora ele não funcionará quando a nova linha estiver em qualquer nome de arquivo. Há apenas uma coisa proibida em provavelmente todos os sistemas de arquivos, que é o caractere nulo. Mas as variáveis no bash não podem conter isso, então não podemos atribuí-lo a IFS .
Como alternativa, xargs podem ser usados para passar os caminhos de find para outro programa. Usando o comando -print0 para find e a opção -0 para xargs , eles usam o caractere nulo como um separador. Adicionar -n1 à chamada xargs manipula um nome de arquivo por vez.
for f in "${(@f)$(find .)}" ; do echo "$f" ; done