O problema é entender algumas substituições que o Bash faz 
quando vc faz
for i in $(comando) ; do
…
done
O bash vai interpretar linha a linha, caracter a caracter até encontrar o $(
ai ele fica esperto: humm… tenho q substituir o que vem a seguir pelo resultado do comando entre ‘$(’ e ‘)’.
se o comando retornar “um dois tres”, isso passa a ser
for i in um dois tres; do
…
done
Agora… se vc tem um arquivo chamado “um dois tres”, o for não vai entender, por causa do IFS.
IFS - input field separator. vc esta usando no nome do arquivo um caracter que é separador de campos/parametros. ai o for se confunde.
Vc pode fazer 2 coisas: uma ganbiarra pra proteger o nome desse arquivo
for i in “$(ls -Q)” ; do
…
done
Que geralmente não funciona 100% dos casos e é muito dependente de plataforma.
Ou vc pode usar um conjunto mais inteligente de ferramentas para este fim!
$ ls -l
total 0
-rw-r–r-- 1 xxx Nenhum 0 Jul 27 12:33 tres
-rw-r–r-- 1 xxx Nenhum 0 Jul 27 12:33 um dois
$ find . -type f -print0 | xargs --null -n 1
./tres
./um dois
fica a dica: de uma olhada no man do find/xargs – tem uma surpresa reservada pra vc 