Como renomear nomes de arquivos para codificação diferente?

8

Eu tenho 3 tipos de file namecodificações no reiserfsdisco rígido montado: CP1251, KOI-8, UTF-8 e ASCII. Eu realmente preciso converter todas as codificações para UTF-8, recursivamente. Existe algum utilitário que detecte a codificação de origem e a converta em UTF-8 ou eu tenho que escrever um script Python?

Pablo
fonte
No caso geral, não é possível "adivinhar" automaticamente a codificação do nome (por exemplo, a maioria das seqüências de bytes são nomes de arquivos válidos KOI-8 e CP1251 (mas dif.)). Você tem alguma pista extra para ajudar a conhecer a codificação de nome?
Nenhuma outra pista :(
Pablo
Você tem nomes de arquivos em minúsculas e maiúsculas?
Sim, tenho nomes de arquivos em minúsculas e (todos) em maiúsculas.
Pablo
Alguém em necessidade? Confira detox. Funcionou para mim entre ISO-8859-1 e UTF-8 usando-s iso8859_1-only
Alwin Kesler

Respostas:

12

Use convmv, uma ferramenta CLI que converte o nome do arquivo entre codificações diferentes. Para converter de ( -f) esses encondings em ( -t) UTF-8, faça o seguinte:

convmv -f CP1251 -t UTF-8 inputfile
convmv -f KOI-8  -t UTF-8 inputfile
convmv -f ASCII  -t UTF-8 inputfile

Além disso, se você deseja converter o conteúdo do arquivo, uso iconv, uma ferramenta CLI para o conteúdo converter arquivos para diferentes codificações. Para converter de ( -f) esses encondings em ( -t) UTF-8, faça o seguinte:

iconv -f CP1251 -t UTF-8 inputfile > outputfile
iconv -f KOI-8  -t UTF-8 inputfile > outputfile
iconv -f ASCII  -t UTF-8 inputfile > outputfile
Marcos Roriz Junior
fonte
1
Não é o conteúdo do arquivo que eu preciso para converter, mas o nome do arquivo em si
Pablo
OK. Você tentou convmv?
Marcos Roriz Junior
O ASCII já é um subconjunto do UTF-8, portanto não há necessidade de conversão.
psusi 4/01/15
1

Não. Uma das grandes desvantagens do antigo sistema de páginas de códigos é que não há como detectar qual está sendo usado; você deve simplesmente saber isso a priori. Se você souber quais arquivos estão usando qual codificação, poderá converter os nomes usando algo como:

mv somefile `echo somefile | iconv -f CP1251 -t UTF-8`
psusi
fonte
Muitos arquivos para renomear manualmente ... Pensei que as páginas de código tivessem intervalos de código de caracteres distintos.
Pablo
@ Pablo, não, esse é o ponto: com um byte de 8 bits, você só tinha 256 códigos de caracteres possíveis. Depois de subtrair o conjunto normal de caracteres ASCII e códigos de controle, resta 128 caracteres restantes para códigos adicionais, o que não é suficiente para representar o intervalo completo de caracteres em todos os idiomas. Cada página de código faz seu próprio uso desses 128 códigos superiores para representar caracteres importantes para o usuário. A única maneira de descobrir qual é o uso é tentar exibir cada página de código possível e ver se o nome parece fazer sentido e isso não é algo que um computador e decidir.
Pssi
bem, python chardeté de alguma forma detectá-lo ...
Pablo
@ Pablo, puro ... parece que faz um palpite com base na prevalência de diferentes caracteres na linguagem escrita. Em outras palavras, assume que certos caracteres, como glifos engraçados, são menos populares do que digamos, um 'a' acentuado, e tenta interpretar os caracteres em cada página de código e encontra aquele que tem mais códigos que correspondem aos caracteres mais populares. Provavelmente não é muito preciso, especialmente com um pequeno número de caracteres, como um nome de arquivo.
Psusi
0

Mesma solução iconvque o @psusi sugeses, mas com loop e while-card:

Também shscript shell on-line :

for f in /path/*.txt; do mv $f `echo $f | iconv -f 866 -t UTF-8`; done

Com a leitura de um cartão while da linha de tubulação:

echo * | for f in `read f&&echo $f`; do mv $f `echo $f | iconv -f 866 -t UTF-8`; done
oklas
fonte