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