Isso está acontecendo porque cut
está exibindo caracteres NULL na saída. Não é possível transmitir argumentos do programa que contenham um caractere nulo (consulte ).
No bash, isso funciona porque o bash não pode manipular caracteres NULL em strings, e isso não acontece. O Zsh é um pouco mais poderoso e pode manipular caracteres NULL. No entanto, quando chega a hora de passar a string para o programa, ela ainda contém o nulo, que sinaliza o fim do argumento.
Vamos ver isso em detalhes.
$ echo 'English/Flavors/AU/stuff1/filename.txt' | cut -d'/' --output-delimiter '' -f1,3 | xxd
0000000: 456e 676c 6973 6800 4155 0a English.AU.
Aqui simulamos um dos seus arquivos, passando o caminho por cut
. Observe a saída xxd
que tem um caractere NULL entre English
e AU
.
Agora vamos percorrer e simular o restante do script.
$ l=$(echo 'English/Flavors/AU/stuff1/filename.txt' | cut -d'/' --output-delimiter '' -f1,3)
$ dest=/stuff2/${l}.utf8.txt
$ echo "$dest" | xxd
0000000: 2f73 7475 6666 322f 456e 676c 6973 6800 /stuff2/English.
0000010: 4155 2e75 7466 382e 7478 740a AU.utf8.txt.
Observe o NULL após o English
. O echo
exibe corretamente porque echo
é um shell interno. Se usarmos um echo
externo, ele também exibe o problema.
$ /bin/echo "$dest" | xxd
0000000: 2f73 7475 6666 322f 456e 676c 6973 680a /stuff2/English.
P.S. Você realmente deveria estar citando também: -)
A solução é não usar cut
, use awk
.
$ echo 'English/Flavors/AU/stuff1/filename.txt' | awk -F/ '{ print $1$3 }' | xxd
0000000: 456e 676c 6973 6841 550a EnglishAU.