Wie benenne ich Dateinamen in andere Codierungen um?


8

Ich habe 3 Arten von file nameCodierungen auf der reiserfsgemounteten Festplatte: CP1251, KOI-8, UTF-8 und ASCII. Ich muss wirklich alle Codierungen rekursiv in UTF-8 konvertieren. Gibt es ein Dienstprogramm, das die Quellcodierung erkennt und in UTF-8 konvertiert, oder muss ich ein Python-Skript schreiben?


Im allgemeinen Fall ist es nicht möglich, die Namenscodierung automatisch zu "erraten" (z. B. sind die meisten Byte-Sequenzen gültige KOI-8- und CP1251-Dateinamen (aber unterschiedliche Dateinamen)). Haben Sie zusätzliche Hinweise, um die Namenscodierung zu ermitteln?

Keine andere Ahnung :(
Pablo

Haben Sie Dateinamen in Klein- und Großbuchstaben?

Ja, ich habe sowohl Kleinbuchstaben als auch (alle) Großbuchstaben.
Pablo

Jemand in Not? Auschecken detox. Es funktionierte für mich zwischen ISO-8859-1 und UTF-8 mit-s iso8859_1-only
Alwin Kesler

Antworten:


12

Verwenden Sie convmv, ein CLI-Tool, das den Dateinamen zwischen verschiedenen Codierungen konvertiert. -fGehen Sie wie folgt vor, um diese Encondings von ( -t) UTF-8 zu konvertieren :

convmv -f CP1251 -t UTF-8 inputfile
convmv -f KOI-8  -t UTF-8 inputfile
convmv -f ASCII  -t UTF-8 inputfile

Wenn Sie den Dateiinhalt konvertieren möchten, verwenden Sie außerdem iconvein CLI-Tool, um den Dateiinhalt in verschiedene Codierungen zu konvertieren. -fGehen Sie wie folgt vor, um diese Encondings von ( -t) UTF-8 zu konvertieren :

iconv -f CP1251 -t UTF-8 inputfile > outputfile
iconv -f KOI-8  -t UTF-8 inputfile > outputfile
iconv -f ASCII  -t UTF-8 inputfile > outputfile

1
Es ist nicht der Dateiinhalt, den ich konvertieren muss, sondern der Dateiname selbst
Pablo

Okay. Hast du convmv ausprobiert?
Marcos Roriz Junior

ASCII ist bereits eine Teilmenge von UTF-8, sodass keine Konvertierung erforderlich ist.
Psusi

1

Nee. Einer der großen Nachteile des alten Codepage-Systems ist, dass es keine Möglichkeit gibt, zu erkennen, welches verwendet wird. Sie müssen einfach wissen, dass a priori. Wenn Sie wissen, welche Dateien welche Codierung verwenden, können Sie die Namen folgendermaßen konvertieren:

mv somefile `echo somefile | iconv -f CP1251 -t UTF-8`

Zu viele Dateien zum manuellen Umbenennen ... Ich dachte, die Codepages haben unterschiedliche Zeichencodebereiche.
Pablo

@Pablo, nein, das ist der ganze Punkt: Mit einem 8-Bit-Byte hatten Sie nur 256 mögliche Zeichencodes. Nach dem Subtrahieren des normalen Satzes von ASCII-Zeichen und Steuercodes bleiben 128 für zusätzliche Codes übrig, was nicht ausreicht, um den gesamten Zeichenbereich in allen Sprachen darzustellen. Jede Codepage verwendet diese oberen 128 Codes selbst, um für den Benutzer wichtige Zeichen darzustellen. Die einzige Möglichkeit, herauszufinden, welche verwendet wird, besteht darin, zu versuchen, jede mögliche Codepage anzuzeigen und zu prüfen, ob der Name sinnvoll erscheint, und das ist kein Computer, und zu entscheiden.
Psusi

Nun, Python chardeterkennt es irgendwie ...
Pablo

@Pablo, ordentlich ... sieht so aus, als würde es eine fundierte Vermutung anstellen, die auf der Verbreitung verschiedener Zeichen in der geschriebenen Sprache basiert. Mit anderen Worten, es wird davon ausgegangen, dass bestimmte Zeichen, wie z. B. alberne Glyphen, weniger beliebt sind als beispielsweise ein akzentuiertes 'a', und versucht, die Zeichen auf jeder Codepage zu interpretieren und dasjenige zu finden, das die meisten Codes enthält, die den beliebtesten Zeichen entsprechen. Es ist jedoch wahrscheinlich nicht sehr genau, insbesondere bei einer kleinen Anzahl von Zeichen, z. B. einem Dateinamen.
Psusi

0

Gleiche Lösung iconvwie bei @psusi sugeses, jedoch mit Schleife und while-Karte:

Auch Online-Shell- shSkript:

for f in /path/*.txt; do mv $f `echo $f | iconv -f 866 -t UTF-8`; done

Mit Lesen der Karte von der Rohrleitung:

echo * | for f in `read f&&echo $f`; do mv $f `echo $f | iconv -f 866 -t UTF-8`; done
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.