O ideal é que você não faça isso de maneira alguma, porque analisar nomes de arquivos adequadamente em um script de shell é sempre difícil (conserte-os para espaços, você ainda terá problemas com outros caracteres incorporados, em particular com nova linha). Isso é listado como a primeira entrada na página BashPitfalls.
Dito isto, há uma maneira de quase fazer o que você quer:
oIFS=$IFS
IFS=$'\n'
find . -name '*.txt' | while read -r i; do
# use "$i" with whatever you're doing
done
IFS=$oIFS
Lembre-se também de citar $i
ao usá-lo, para evitar outras coisas ao interpretar os espaços mais tarde. Lembre-se também de definir $IFS
de volta depois de usá-lo, porque não fazer isso causará erros desconcertantes depois.
Isso tem uma outra ressalva anexada: o que acontece dentro do loop while
pode ocorrer em um subshell, dependendo do shell exato que você está usando, portanto as configurações variáveis podem não persistir. A versão for
do loop evita isso, mas pelo preço que, mesmo se você aplicar a solução $IFS
para evitar problemas com espaços, você terá problemas se o find
retornar muitos arquivos.
Em algum momento, a correção correta para tudo isso é fazê-lo em uma linguagem como Perl ou Python, em vez de shell.