¿Cómo saber la codificación de idioma de un nombre de archivo en Linux?

17

Tengo un directorio con ~ 10,000 archivos de imagen de una fuente externa.

Muchos de los nombres de archivo contienen espacios y signos de puntuación que no son compatibles con DB o con Web. También quiero agregar un número de SKU al final de cada nombre de archivo (para fines contables). Muchos, si no la mayoría de los nombres de archivo también contienen caracteres latinos extendidos que quiero conservar para fines de SEO (específicamente para que los nombres de archivo representen con precisión el contenido del archivo en Google Imágenes)

He creado un script bash que cambia el nombre (copias) de todos los archivos a mi resultado deseado. El script bash se guarda en UTF-8. Después de ejecutarlo, omite aproximadamente 500 de los archivos (no se puede registrar el archivo ...).

He corrido convmv -f UTF-8 -t UTF-8 en el directorio, y descubrieron estos 500 nombres de archivo son no codificados en UTF-8 (convmv es capaz de detectar e ignorar los nombres de archivos que ya están en UTF-8)

¿Hay alguna manera fácil de averiguar qué codificación de idioma están usando actualmente?

La única forma en que me he podido dar cuenta es configurando mi codificación de terminal en UTF-8, luego iterando a través de todas las posibles codificaciones candidatas con convmv hasta que muestre un nombre convertido que 'se vea bien'. No tengo forma de estar seguro de que todos estos 500 archivos usan la misma codificación, por lo que necesitaría repetir este proceso 500 veces. ¡Me gustaría un método más automatizado que 'parece correcto'!

cableado
fuente

Respuestas:

13

No hay una forma 100% precisa realmente, pero hay una manera de hacer una buena suposición.

Hay un chardet de la biblioteca de Python que está disponible aquí: https://pypi.python.org/pypi/chardet

p.ej

Vea en qué se establece la variable LANG actual:

$ echo $LANG
en_IE.UTF-8

Cree un nombre de archivo que deberá codificarse con UTF-8

$ touch mÉ.txt

Cambie nuestra codificación y vea qué sucede cuando intentamos y enumeramos

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

Bien, ahora tenemos un nombre de archivo codificado en UTF-8 y nuestra ubicación actual es C (página de códigos estándar de Unix).

Inicie Python, importe chardet y haga que lea el nombre del archivo. Estoy usando un poco de shell shell (es decir, expansión a través del carácter comodín *) para obtener mi archivo. Cambie "ls m *" a lo que coincida con uno de sus archivos de ejemplo.

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

Como puede ver, es solo una suposición. Cuán buena es la suposición de la variable "confianza".

Philip Reynolds
fuente
el script funciona como se describe, pero en mi caso, chardet no encontró la codificación del archivo.
Fedir RYKHTIK
6

Puede resultarle útil para probar el directorio de trabajo actual (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'])

El resultado se ve así:

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 repetir la ruta del directorio actual, córtela y péguela en un pequeño script de 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
fuente
¿Funciona eso también con la codificación asiática? ¿O es eurocéntrico?
cableado el