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?

Pablo
quelle
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
Marcos Roriz Junior
quelle
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`
psusi
quelle
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
oklas
quelle