Wie erkenne ich die Sprachcodierung eines Dateinamens unter Linux?

17

Ich habe ein Verzeichnis mit ~ 10.000 Bilddateien von einer externen Quelle.

Viele der Dateinamen enthalten Leerzeichen und Satzzeichen, die nicht DB- oder Web-freundlich sind. Ich möchte auch eine SKU-Nummer an das Ende jedes Dateinamens anhängen (zu Abrechnungszwecken). Viele, wenn nicht die meisten Dateinamen enthalten auch erweiterte lateinische Zeichen, die ich für SEO-Zwecke behalten möchte (insbesondere, damit die Dateinamen den Dateiinhalt in Google Bilder genau wiedergeben).

Ich habe ein Bash-Skript erstellt, das alle Dateien in das gewünschte Ergebnis umbenennt (kopiert). Das Bash-Skript wird in UTF-8 gespeichert. Nach dem Ausführen werden ca. 500 Dateien ausgelassen (Datei kann nicht erstellt werden ...).

Ich habe convmv -f UTF-8 -t UTF-8 für das Verzeichnis ausgeführt und festgestellt, dass diese 500 Dateinamen nicht in UTF-8 codiert sind (convmv kann bereits in UTF-8 vorhandene Dateinamen erkennen und ignorieren).

Kann ich auf einfache Weise herausfinden, welche Sprachcodierung sie aktuell verwenden?

Der einzige Weg, wie ich es selbst herausfinden konnte, ist, meine Terminal-Codierung auf UTF-8 zu setzen und dann alle wahrscheinlichen Kandidaten-Codierungen mit convmv zu durchlaufen, bis ein konvertierter Name angezeigt wird, der "richtig aussieht". Ich kann nicht sicher sein, dass diese 500 Dateien alle die gleiche Codierung verwenden, daher müsste ich diesen Vorgang 500 Mal wiederholen. Ich hätte gerne eine automatisiertere Methode als "sieht gut aus" !!!

verdrahtet
quelle

Antworten:

13

Es gibt keinen wirklich 100% genauen Weg, aber es gibt einen Weg, eine gute Vermutung anzustellen.

Es gibt ein Python-Bibliotheks-Chardet, das hier verfügbar ist: https://pypi.python.org/pypi/chardet

z.B

Sehen Sie, wie die aktuelle LANG-Variable eingestellt ist:

$ echo $LANG
en_IE.UTF-8

Erstellen Sie einen Dateinamen, der mit UTF-8 codiert werden muss

$ touch mÉ.txt

Ändern Sie unsere Kodierung und sehen Sie, was passiert, wenn wir versuchen, sie aufzulisten

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

OK, jetzt haben wir einen in UTF-8 codierten Dateinamen und unser aktuelles Gebietsschema ist C (Standard-Unix-Codepage).

Starten Sie also Python, importieren Sie Chardet und lesen Sie den Dateinamen. Ich verwende ein Shell-Globbing (dh Erweiterung durch das Platzhalterzeichen *), um meine Datei abzurufen. Ändern Sie "ls m *" in eine Ihrer Beispieldateien.

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

Wie Sie sehen können, ist es nur eine Vermutung. Wie gut eine Vermutung ist, zeigt die Variable "confidence".

Philip Reynolds
quelle
Das Skript funktioniert wie beschrieben, aber in meinem Fall hat chardet die Kodierung der Datei nicht gefunden.
Fedir RYKHTIK
6

Dies kann nützlich sein, um das aktuelle Arbeitsverzeichnis (Python 2.7) zu testen:

import chardet
import os  

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

Ergebnis sieht so aus:

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)

Um den Pfad aus dem aktuellen Verzeichnis wiederzugewinnen, schneiden Sie ihn aus und fügen Sie ihn in ein kleines Python-Skript ein:

#!/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
quelle
Funktioniert das auch mit asiatischer Kodierung? Oder ist es eurozentrisch?
Verdrahtet