Comment savoir l'encodage de la langue d'un nom de fichier sous Linux?

17

J'ai un répertoire contenant environ 10 000 fichiers image provenant d'une source externe.

De nombreux noms de fichiers contiennent des espaces et des signes de ponctuation qui ne sont pas compatibles avec les bases de données ou les sites Web. Je veux également ajouter un numéro de SKU à la fin de chaque nom de fichier (à des fins comptables). Beaucoup, sinon la plupart des noms de fichiers contiennent également des caractères latins étendus que je souhaite conserver à des fins de référencement (en particulier pour que les noms de fichiers représentent avec précision le contenu du fichier dans Google Images)

J'ai créé un script bash qui renomme (copie) tous les fichiers selon le résultat souhaité. Le script bash est enregistré en UTF-8. Après l'exécution, il omet environ 500 des fichiers (impossible de stat stat fichier ...).

J'ai exécuté convmv -f UTF-8 -t UTF-8 sur le répertoire et découvert que ces 500 noms de fichiers ne sont pas codés en UTF-8 (convmv est capable de détecter et d'ignorer les noms de fichiers déjà en UTF-8)

Existe-t-il un moyen simple de savoir quelle langue d'encodage ils utilisent actuellement?

La seule façon dont j'ai pu me comprendre est de définir mon codage de terminal sur UTF-8, puis de parcourir tous les codages candidats probables avec convmv jusqu'à ce qu'il affiche un nom converti qui `` semble correct ''. Je n'ai aucun moyen d'être certain que ces 500 fichiers utilisent tous le même encodage, donc je devrais répéter ce processus 500 fois. Je voudrais une méthode plus automatisée que «semble juste» !!!

recâblé
la source

Réponses:

13

Il n'y a pas vraiment de moyen précis à 100%, mais il y a un moyen de donner une bonne supposition.

Il existe un chardet de bibliothèque python qui est disponible ici: https://pypi.python.org/pypi/chardet

par exemple

Voir à quoi la variable LANG actuelle est définie:

$ echo $LANG
en_IE.UTF-8

Créez un nom de fichier qui devra être encodé avec UTF-8

$ touch mÉ.txt

Modifiez notre encodage et voyez ce qui se passe lorsque nous essayons de le répertorier

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

OK, nous avons donc maintenant un nom de fichier encodé en UTF-8 et notre locale actuelle est C (page de code Unix standard).

Lancez donc python, importez chardet et faites-le lire le nom du fichier. J'utilise un globbing shell (c'est-à-dire une expansion via le caractère générique *) pour obtenir mon fichier. Remplacez «ls m *» par ce qui correspondra à l'un de vos fichiers d'exemple.

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

Comme vous pouvez le voir, ce n'est qu'une supposition. La valeur de la confiance est indiquée par la variable "confiance".

Philip Reynolds
la source
le script fonctionne comme décrit, mais dans mon cas, chardet n'a pas trouvé l'encodage du fichier.
Fedir RYKHTIK
6

Vous pouvez trouver cela utile pour tester le répertoire de travail actuel (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'])

Le résultat ressemble à:

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)

Pour extraire le chemin d'accès du répertoire actuel, copiez-collez-le dans un petit 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
la source
Cela fonctionne-t-il également avec l'encodage asiatique? Ou est-ce eurocentrique?
recâblé