Come rinominare i nomi dei file con codifiche diverse?


8

Ho 3 tipi di file namecodifiche sul reiserfsdisco rigido montato: CP1251, KOI-8, UTF-8 e ASCII. Ho davvero bisogno di convertire tutte le codifiche in UTF-8, in modo ricorsivo. C'è qualche utilità che rileverà la codifica sorgente e la convertirà in UTF-8 o devo scrivere script Python?


Nel caso generale, non è possibile "indovinare" automaticamente la codifica dei nomi (ad esempio, la maggior parte delle sequenze di byte sono nomi di file KOI-8 e CP1251 (ma diff.) Validi). Hai qualche indizio in più per aiutarti a conoscere la codifica del nome?

Nessun altro indizio :(
Pablo

Hai nomi di file sia minuscoli che maiuscoli?

Sì, ho nomi di file sia minuscoli che (tutti) maiuscoli.
Pablo,

Qualcuno nel bisogno? Partenza detox. Ha funzionato per me tra ISO-8859-1 e UTF-8 utilizzando-s iso8859_1-only
Alwin Kesler,

Risposte:


12

Utilizzare convmv, uno strumento CLI che converte il nome del file tra diverse codifiche. Per convertire da ( -f) queste codifiche in ( -t) UTF-8, procedi come segue:

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

Inoltre, se si desidera convertire il contenuto del file, utilizzare iconvuno strumento CLI per convertire il contenuto del file in diverse codifiche. Per convertire da ( -f) queste codifiche in ( -t) UTF-8, procedi come segue:

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
Non è il contenuto del file che devo convertire, ma il nome del file stesso
Pablo,

Va bene. Hai provato convmv?
Marcos Roriz Junior,

ASCII è già un sottoinsieme di UTF-8, quindi non è necessario convertirlo.
psusi

1

No. Uno dei principali svantaggi del vecchio sistema di code page è che non esiste alcun modo per rilevare quale viene utilizzato; devi semplicemente saperlo a priori. Se sai quali file stanno usando quale codifica, puoi convertire i nomi usando qualcosa come:

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

Troppi file da rinominare manualmente ... Pensavo che le tabelle codici avessero intervalli di codici di caratteri distinti.
Pablo,

@Pablo, no, questo è l'intero punto: con un byte a 8 bit avevi solo 256 possibili codici carattere. Dopo aver sottratto il normale set di caratteri ASCII e codici di controllo che ne lasciano 128 per ulteriori codici, che non è sufficiente per rappresentare l'intera gamma di caratteri in tutte le lingue. Ogni tabella codici fa uso proprio di quei 128 codici superiori per rappresentare caratteri importanti per l'utente. L'unico modo per capire quale sia in uso è provare a visualizzare ogni possibile tabella codici e vedere se il nome sembra avere senso e che non è qualcosa di un computer e decidere.
psusi,

bene, in chardetqualche modo Python lo sta rilevando ...
Pablo,

@Pablo, pulito ... sembra che faccia un'ipotesi educata basata sulla prevalenza di diversi personaggi nella lingua scritta. In altre parole, presuppone che alcuni caratteri, come i glifi sciocchi, siano meno popolari di quanto dicano, una "a" accentata, e prova a interpretare i caratteri in ciascuna tabella codici e trova quello che ha il maggior numero di codici che corrispondono ai caratteri più popolari. Tuttavia, probabilmente non è molto preciso, specialmente su un numero limitato di caratteri, come un nome file.
psusi

0

Stessa soluzione con iconv@psusi sugeses ma con loop e while-card:

Anche shscript shell online :

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

Con la lettura di while-card dalla linea del tubo:

echo * | for f in `read f&&echo $f`; do mv $f `echo $f | iconv -f 866 -t UTF-8`; done
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.