Comment renommer les noms de fichiers en différents encodages?

8

J'ai 3 types d' file nameencodages sur reiserfsdisque dur monté: CP1251, KOI-8, UTF-8 et ASCII. J'ai vraiment besoin de convertir tous les encodages en UTF-8, récursivement. Existe-t-il un utilitaire qui détecte le codage source et le convertit en UTF-8 ou dois-je écrire un script Python?

Pablo
la source
Dans le cas général, il n'est pas possible de "deviner" automatiquement le codage du nom (par exemple, la plupart des séquences d'octets sont des noms de fichiers KOI-8 et CP1251 valides (mais diff.)). Avez-vous des indices supplémentaires pour connaître l'encodage du nom?
Aucun autre indice :(
Pablo
Avez-vous des noms de fichiers en minuscules et en majuscules?
Oui, j'ai des noms de fichiers en minuscules et (tous) en majuscules.
Pablo
Quelqu'un dans le besoin? Découvrez detox. Cela a fonctionné pour moi entre ISO-8859-1 et UTF-8 en utilisant-s iso8859_1-only
Alwin Kesler

Réponses:

12

Utilisez convmv, un outil CLI qui convertit le nom de fichier entre différents encodages. Pour convertir de ( -f) ces entrées en ( -t) UTF-8, procédez comme suit:

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

De plus, si vous souhaitez convertir le contenu du fichier, utilisez iconvun outil CLI pour convertir le contenu du fichier en différents encodages. Pour convertir de ( -f) ces entrées en ( -t) UTF-8, procédez comme suit:

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
la source
1
Ce n'est pas le contenu du fichier que je dois convertir, mais le nom du fichier lui
Pablo
D'accord. Avez-vous essayé convmv?
Marcos Roriz Junior du
ASCII est déjà un sous-ensemble de UTF-8, il n'est donc pas nécessaire de convertir.
psusi
1

Nan. L'un des gros inconvénients de l'ancien système de pages de codes est qu'il n'y a aucun moyen de détecter lequel est utilisé; il faut simplement savoir cela a priori. Si vous savez quels fichiers utilisent quel encodage, vous pouvez convertir les noms en utilisant quelque chose comme:

mv somefile `echo somefile | iconv -f CP1251 -t UTF-8`
psusi
la source
Trop de fichiers à renommer manuellement ... Je pensais que les pages de codes ont des plages de codes de caractères distinctes.
Pablo
@Pablo, non, c'est tout l'intérêt: avec un octet de 8 bits, vous n'aviez que 256 codes de caractères possibles. Après avoir soustrait l'ensemble normal de caractères ASCII et de codes de contrôle, il reste 128 pour les codes supplémentaires, ce qui n'est pas suffisant pour représenter la gamme complète de caractères dans toutes les langues. Chaque page de codes utilise ses propres 128 codes supérieurs pour représenter des caractères importants pour l'utilisateur. La seule façon de déterminer ce qui est utilisé est d'essayer d'afficher chaque page de code possible et de voir si le nom semble logique et que ce n'est pas quelque chose d'un ordinateur et de décider.
psusi
eh bien, python le chardetdétecte d'une manière ou d'une autre ...
Pablo
@Pablo, soigné ... on dirait qu'il fait une supposition éclairée basée sur la prévalence de différents caractères dans la langue écrite. En d'autres termes, il suppose que certains caractères, comme les glyphes maladroits, sont moins populaires que disons, un `` a '' accentué, et essaie d'interpréter les caractères dans chaque page de codes et trouve celui qui a le plus de codes qui correspondent aux caractères les plus populaires. Cependant, il n'est probablement pas très précis, en particulier sur un petit nombre de caractères, comme un nom de fichier.
psusi
0

Même solution avec iconv@psusi sugeses mais avec boucle et while-card:

Également un shscript shell en ligne :

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

Avec lecture de la carte en cours de conduite:

echo * | for f in `read f&&echo $f`; do mv $f `echo $f | iconv -f 866 -t UTF-8`; done
oklas
la source