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

16

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 nem compatíveis com a Web. Eu 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 dos arquivos representem com precisão o conteúdo do arquivo nas Imagens do Google)

Eu fiz 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, omite aproximadamente 500 dos arquivos (não é possível gravar o arquivo estatístico ...).

Eu executei convmv -f UTF-8 -t UTF-8 no diretório e descobri que esses 500 nomes de arquivos são não codificados em UTF-8 (convmv is capaz de detectar e ignorar nomes de arquivos já em UTF-8)

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

A única maneira pela qual eu fui capaz de descobrir é definir minha codificação de terminal como UTF-8, depois iterar todas as possíveis codificações de candidatos 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, então eu precisaria repetir esse processo 500 vezes. Eu gostaria de um método mais automatizado do que "parece certo" !!!

    
por rwired 09.11.2009 / 09:06

2 respostas

12

Não há uma maneira 100% precisa, mas há uma maneira de dar um palpite.

Existe um chardet da biblioteca python que está disponível aqui: link

por exemplo,

Veja o que a variável LANG atual está definida como:

$ echo $LANG
en_IE.UTF-8

Crie um nome de arquivo que precise 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 nosso código de idioma atual é C (página de código Unix padrão).

Então inicie o python, importe o chardet e faça com que ele leia o nome do arquivo. Eu uso alguns shell globbing (ou seja, expansão através do * caractere curinga) para obter o 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. Que bom palpite é mostrado pela variável "confiança".

    
por 09.11.2009 / 12:21
6

Você pode achar isto ú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 é semelhante:

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 recapitular 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'])
    
por 31.08.2012 / 15:35