Tenho arquivos com caracteres inválidos como estes
009_-_�%86ndringshåndtering.html
É Æ
onde algo deu errado no nome do arquivo.
Existe uma maneira de remover todos os caracteres inválidos?
ou poderia tr
ser usado de alguma forma?
echo "009_-_�%86ndringshåndtering.html" | tr ???
Eu tinha alguns arquivos japoneses com nomes de arquivos quebrados recuperados de um pendrive quebrado e as soluções acima não funcionaram para mim.
Recomendo o pacote detox:
Exemplo de uso:
Uma maneira seria com sed:
Substitua
file
pelo nome do seu arquivo, é claro. Isso substituirá qualquer coisa que não seja uma letra, número, ponto, sublinhado ou traço por um sublinhado. Você pode adicionar ou remover caracteres para manter como quiser e/ou alterar o caractere de substituição para qualquer outra coisa, ou nada.Eu suponho que você esteja na caixa Linux e os arquivos foram feitos em uma caixa Windows. O Linux usa UTF-8 como codificação de caracteres para nomes de arquivos, enquanto o Windows usa outra coisa. Acho que essa é a causa do problema.
Eu usaria "convmv". Esta é uma ferramenta que pode converter nomes de arquivos de uma codificação de caracteres para outra. Para a Europa Ocidental, um desses normalmente funciona:
Se você precisar instalá-lo em um Linux baseado em Debian, você pode fazê-lo executando:
Funciona para mim todas as vezes e recupera o nome do arquivo original.
Fonte: LeaseWebLabs
Eu suponho que você quer dizer que deseja percorrer o sistema de arquivos e corrigir todos esses arquivos?
Aqui está a maneira que eu faria isso
Isso encontraria todos os arquivos com caracteres não ASCII e substituiria esses caracteres por sublinhados (
_
). Tenha cuidado, porém, se um arquivo com o novo nome já existir, ele o substituirá. O script pode ser modificado para verificar esse caso, mas não coloquei isso para simplificar.Seguindo as respostas em https://stackoverflow.com/questions/2124010/grep-regex-to-match-non-ascii-characters , você pode usar:
onde
*
corresponde aos arquivos que você deseja renomear. Se você quiser fazer isso em vários diretórios, você pode fazer algo como:Você pode usar o argumento -n
rename
para fazer uma simulação e ver o que seria alterado, sem alterá-lo.Este script de shell limpa um diretório recursivamente, para tornar os arquivos portáteis entre Linux/Windows e FAT/NTFS/exFAT. Ele remove caracteres de controle
/:*?"<>\|
e alguns nomes reservados do Windows, comoCOM0
.O Linux é menos restritivo em teoria (
/
e\0
é estritamente proibido em nomes de arquivos), mas na prática vários caracteres interferem com comandos bash (como*
...) então eles também devem ser evitados em nomes de arquivos.Ótimas fontes para restrições de nomenclatura de arquivos:
Eu uso este one-liner para remover caracteres inválidos em arquivos de legendas:
Funciona para normalizar os nomes dos diretórios dos filmes:
Mesmas etapas acima, mas adicionei mais um comando sed para remover um ponto no final do diretório
X-Men Days of Future Past (2014) [1080p]
Modificado para:
X-Men.Days.of.Future.Past.2014.1080p
Se você deseja lidar com novas linhas incorporadas, caracteres multibyte, espaços, traços iniciais, barras invertidas e espaços, precisará de algo mais robusto, consulte esta resposta:
https://superuser.com/a/858671/365691
Eu coloquei o script em code.google.com se alguém estiver interessado: rnf-bash-rename-script
Eu sei que isso é um pouco antigo, mas recentemente descobri que o shell de tradução do Google realmente ajuda com arquivos nomeados estrangeiros com nomes unicode sufocantes. Renomeação de lote útil com tradução em shell.
https://github.com/soimort/translate-shell
[ATUALIZAÇÃO] A API do Google Tradutor tende a bloqueá-lo se você clicar nela muitas vezes, mas também encontrei uma opção local conveniente que converte entre alfabetos chamada uconv. Útil foneticamente, mas não tradução:
para arquivo em *; do mv "$arquivo" $(echo "$arquivo" | sed -e 's/[^A-Za-z0-9. -]/ /g'); feito &