Réencodage d'une arborescence vers l'UTF-8
(pour l'instant c'est une page rapidement écrite, je verrai plus tard si j'ai le temps de faire mieux)
Script bash pour convertir toute une arborescence d'un encodage dans un autre.
Le passage de Mandriva 2006 à Mandriva 2007, en particulier, occasionne bien des soucis avec les fichiers créés sous l'ancien système.
En effet, Mandriva 2006 utilise l'encodage ISO-xxx (ISO-8859-1 ou 15 pour le français) et Mandriva 2007 utilise l'encodage UTF-8 dont certains caractères sont codés sur 2 octets (caractères accentués notamment). D'où des problèmes d'affichage du nom et du contenu des fichiers codés ISO-8859-1 sous un système qui lit en UTF-8....
2 solutions :
revenir dans l'ancien encodage : sous Mandriva 2007, c'est facile : utilisez drakelocale. Ce topic du forum d'utilisateurs de Mandriva en parle : tutoriel MDV 2007 - UTF-8 ou latin1 ?
convertir TOUS ses fichiers (nom ET contenu en UTF-8)
une remarque : les fichiers HTML n'ont a priori pas besoin de convertir leur contenu car l'encodage est précisé dans la page et le navigateur s'adapte. En fait seuls les fichiers purement texte ont vraiment besoin de convertir leur contenu car ils ne contiennent pas d'informations d'encodage (certains éditeurs comme vi et jEdit devinent l'encodage cependant...)
Il existe des outils pour faire ces tâches :
conmv : convertit le nom du fichier
iconv : convertit le contenu du fichier
file -i est capable de donner le type du fichier et pour les fichier texte son encodage.
Tous ces programmes sont installables avec la distribution Mandriva (par rpmdrake via le centre de contrôle Mandriva ou par urpmi conmv iconv)
J'ai créé un petit script Bash pour faire la conversion « nom + contenu » sur toute une arborescence. Voici ce qu'il fait :
1- pour toute l'arborescence donnée en paramètre il convertit les noms de fichiers et de répertoires (convmv).
2- il descend dans l'arborescence et pour chaque fichier il lit le charset (file -i), si celui-ci est différent du charset visé (UTF-8) il convertit le fichier (en conservant la date et les droits).
Le script : par ici en couleur ou en simple texte. (mise à jour : 17/03/2007)
Utilisation :
FAITES UNE COPIE DE VOS FICHIERS ET TRAVAILLEZ SUR LA COPIE
$ ./convertEnc.sh chemin/vers/dossier
Bugs :
évitez de mettre en paramètre un répertoire
dont le nom est à réencoder, car la première
partie du script se passerait bien mais ensuite la deuxième
sera sautée car le paramètre ne correspondra plus au
nom du répertoire (voir commentaires dans le code).
Ce problème est corrigé. Merci JacquesF
Si la liste des fichiers dans un même répertoire est trop longue on obtient une erreur du style :
convertEnc.sh: line 95: [: too many arguments
Ce problème est corrigé, Merci JacquesF et cibou57.
J'ai remarqué qu'en cas de plantage de iconv le fichier converti ne l'était qu'à moitié et qu'ensuite
la réécriture du fichier converti sur l'ancien entraine une perte de données... D'où l'intérêt de travailler sur une copie des données...
Pour conserver l'horodatage (+ permissions...) utilisez cp -p.
Pour régler çà il faudrait connaitre le statut réussite/échec de la commande iconv
=> Cela est fait.
Mise à jour :
Mandriva a publié un script Perl pour effectuer la conversion des noms de fichiers. Il est disponible ici : http://qa.mandriva.com/twiki/bin/view/Main/MandrivaLinux2007Errata#UTF8_issue_when_reinstalling_and. Notez bien qu'il ne convertit que les noms de fichiers et pas le contenu !
Discussion :
Pour l'instant je n'ai pas mis de blog (ou forum, l'installation des modules sur les sites free.fr est en panne visiblement....) sur ce site, donc les discussions sont sur le forum Mandriva, sujets Logiciels Divers / MAJ -> 2007 : UTF-8 et Conversion fichiers ISO vers UTF8.
Toute suggestion, amélioration sont bienvenues sur ce forum....