Este gráfico representa o caractere cujo valor Unicode é 000A (em hexadecimal). Este é o caractere de alimentação de linha (LF) , ou seja, uma quebra de linha.
O Linux permite quebras de linha em nomes de arquivos, mas são muito incomuns. É possível manipular nomes de arquivos com quebras de linha em scripts de shell, mas você precisa ter um cuidado especial. Seu script analisa a saída de find
e, como essa saída usa novas linhas para separar itens, esse método não pode lidar intrinsicamente com novas linhas em nomes de arquivos.
Seu script é muito mais complicado do que precisa ser. Se você mantiver as coisas simples, funcionará. Como regra geral, aja nos dados quando você os tiver, em vez de compactar tudo em um fluxo de texto e analisá-lo novamente.
Com find
, não analise a saída. Use a ação -exec
.
A maneira mais simples de fazer isso renomear (eu substituirei as novas linhas por espaços) é com zsh , graças a sua % funçãozmv
.
autoload -U zmv # put this in your .zshrc
cd $working_dir
zmv '**/*' $'${f//\n/ }'
Se você realmente precisa se ater a programas que são sempre pré-instalados em Linux não embarcado, aqui está um método simples (se um pouco lento) que depende do bash para renomear:
find "$working_dir" -type f -name '*
*' -exec bash -c 'mv "$0" "${0//
/ }"' {} \;
Você pode acelerar isso invocando o bash em lotes de arquivos:
find "$working_dir" -type f -name '
' -exec bash -c 'for x; do mv "$x" "${x//
/ }"' _ {} +
Se houver uma única nova linha no Linux, você pode usar o rename
comando (chamado rename.ul
no Debian e derivados).
find "$working_dir" -type f -name '
' -exec rename '
' ' ' {} +
Se você tiver prename
:
find "$working_dir" -type f -name '
' -exec prename 'y/\n/ /' {} +