Como saber a codificação de idioma de um nome de arquivo no Linux?

17

Eu tenho um diretório com ~ 10.000 arquivos de imagem de uma fonte externa.

Muitos dos nomes de arquivos contêm espaços e sinais de pontuação que não são compatíveis com DB ou Web. Também quero acrescentar um número de SKU ao final de cada nome de arquivo (para fins de contabilidade). Muitos, se não a maioria dos nomes de arquivos, também contêm caracteres latinos estendidos que eu quero manter para fins de SEO (especificamente para que os nomes de arquivos representem com precisão o conteúdo do arquivo nas Imagens do Google)

Eu criei um script bash que renomeia (copia) todos os arquivos para o resultado desejado. O script bash é salvo em UTF-8. Após a execução, ele omite aproximadamente 500 dos arquivos (não é possível o arquivo stat ...).

Eu tenho que correr convmv -f UTF-8 -t UTF-8 no diretório, e descobriu estes 500 nomes de arquivos são não codificados em UTF-8 (convmv é capaz de detectar e ignorar nomes já em UTF-8)

Existe uma maneira fácil de descobrir qual codificação de idioma eles estão usando atualmente?

A única maneira de descobrir a mim mesmo é definindo minha codificação de terminal para UTF-8 e, em seguida, iterando todas as prováveis ​​codificações candidatas com convmv até exibir um nome convertido que 'parece certo'. Não tenho como ter certeza de que esses 500 arquivos usam a mesma codificação, portanto, eu precisaria repetir esse processo 500 vezes. Gostaria de um método mais automatizado do que 'parece certo' !!!

rwired
fonte

Respostas:

13

Não existe uma maneira 100% precisa, mas existe uma maneira de dar um bom palpite.

Há um chardet da biblioteca python disponível aqui: https://pypi.python.org/pypi/chardet

por exemplo

Veja como a variável LANG atual está configurada para:

$ echo $LANG
en_IE.UTF-8

Crie um nome de arquivo que precisará ser codificado com UTF-8

$ touch mÉ.txt

Altere nossa codificação e veja o que acontece quando tentamos listá-la

$ ls m*
mÉ.txt
$ export LANG=C
$ ls m*
m??.txt

OK, agora temos um nome de arquivo codificado em UTF-8 e nossa localidade atual é C (página de código padrão do Unix).

Então inicie o python, importe o chardet e faça com que ele leia o nome do arquivo. Estou usando alguns shell globbing (ou seja, expansão através do caractere * curinga) para obter meu arquivo. Altere "ls m *" para o que corresponder a um dos seus arquivos de exemplo.

>>> import chardet
>>> import os
>>> chardet.detect(os.popen("ls m*").read())
{'confidence': 0.505, 'encoding': 'utf-8'}

Como você pode ver, é apenas um palpite. Quão boa estimativa é mostrada pela variável "confiança".

Philip Reynolds
fonte
O script funciona como descrito, mas no meu caso, chardet não encontrou a codificação do arquivo.
Fedir RYKHTIK
6

Você pode achar isso útil para testar o diretório de trabalho atual (python 2.7):

import chardet
import os  

for n in os.listdir('.'):
    print '%s => %s (%s)' % (n, chardet.detect(n)['encoding'], chardet.detect(n)['confidence'])

O resultado parece:

Vorlagen => ascii (1.0)
examples.desktop => ascii (1.0)
Öffentlich => ISO-8859-2 (0.755682154041)
Videos => ascii (1.0)
.bash_history => ascii (1.0)
Arbeitsfläche => EUC-KR (0.99)

Para percorrer o caminho do diretório atual, recorte e cole isso em um pequeno script python:

#!/usr/bin/python

import chardet
import os

for root, dirs, names in os.walk('.'):
    print root
    for n in names:
        print '%s => %s (%s)' % (n, chardet.detect(n)['encoding'], chardet.detect(n)['confidence'])
Klaus Kappel
fonte
Isso também funciona com codificação asiática? Ou é eurocêntrico?
Rwired 31/08/2012