Como apontado nos comentários à minha pergunta, o problema ocorre quando duas condições são atendidas:
- O arquivo de origem e de destino é o mesmo.
- O arquivo é maior que 32768 bytes.
Existem duas soluções: converter um arquivo temporário que substitui automaticamente o arquivo de origem ou usar recode
.
Quanto à primeira solução, veja por exemplo. link . Para sponge
, há uma pergunta muito boa sobre SO ( link ) e também uma resposta aqui: link
Agora vou usar iconv
como recode
suporta menos conjuntos de caracteres (e também não consegui executá-lo):
FILELIST=$(find . -type f -name "*.dat")
for file in $FILELIST
do
iconv --from-code='UTF-8' --to-code='ASCII//TRANSLIT' "$file" | sponge "$file"
done
sponge
faz o trabalho de substituição. É de moreutils .