je suis sous mandriva free 2007.
Lors de la migration vers mandriva (avant j'étais sous debian), et donc vers utf8, les caractères spéciaux dans les noms de fichiers et dans les fichiers (txt notamment) ont été remplacés par des caractères illisibles.
A priori c'est normal, vu que j'ai trouvé les posts correspondants dans le forum :
"tutoriel MDV 2007 - UTF-8 ou latin1 ?"
"[Résolu] MAJ -> 2007 : UTF-8"
La solution semble être de convertir à l'aide d'iconv et de convmv. Le tuto: http://sebdeblinux.free.fr/ permet d'utiliser un script.
quand je l'execute j'ai l'erreur :
/convertEnc.sh: line 95: [: too many arguments
telle que décrite dans "[Résolu] MAJ -> 2007 : UTF-8[/url".
Est-ce que quelqu'un a un script corrigé svp? mes connaissances limitées ne me permettent pas de le corriger moi-même avec les infos disséminées dans les posts...
j'ai pas mal de données à convertir, je suis donc aussi une bêta-testeuse potentielle, si vous voulez vous lancer !
Merci pour votre aide!
Last edited by cibou 57 on Tue Mar 13, 2007 11:55 am; edited 1 time in total
car il ne concerne que les noms de fichiers et pas leur contenu, ce qui ne résoudrait que la moitié du problème. Je suis à la recherche d'une modification en masse pour des fichiers .txt ainsi que le propose le script cité ci-dessus (sauf qu'il plante).
Ah, je vois. Je n'ai eu de problèmes qu'avec le nom des fichiers, pas avec leur contenu donc ce script m'a suffit.
Pour le contenu, même si le script plante, fait un essai avec un fichier. Le code du script est assez clair et commenté, alors essaye chaque commande du script une par une. Voici la routine qui convertit le contenu d'un fichier :
Code:
do_convert()
51:{
52:fic="$1"
53:echo " Fichier $fic"
54:# Lecture du type mime
55:encForm=`file -bi "$fic" | awk -F "charset=" '{ print $2 }'`
56:if [ ! "$encForm" = "" ]; then
57: # le fichier possede un charset
58: echo " -> $encForm"
59: if [ ! "$encForm" = "$TO" ]; then
60: # ce charset est different de celui vise
61: # nom du fichier converti temporaire
62: renomme "$fic"_"$TO"
63: nouv_fic=$nouvnom
64: # la conversion
65: iconv -f "$encForm" -t $TO "$fic" -o "$nouv_fic"
66: # Pour conserver la/les date(s) :
67: touch -r "$fic" "$nouv_fic"
68: # Pour conserver le proprietaire
69: chown --reference "$fic" "$nouv_fic"
70: # pour conserver les droits :
71: chmod --reference "$fic" "$nouv_fic"
72: # on ecrase l'ancien fichier par le nouveau
73: mv -f "$nouv_fic" "$fic"
74: fi
75:fi
76:
77:}
ok et merci.
les commandes décrites fonctionnent, donc on peut convertir les fichiers 1 à 1. ça me fait quand même encore pas mal de boulot ;(
le script essaie de travailler sur tous les fichiers d'un répertoire de manière récursive (je lis les annotations !).
Le problème se situe apparemment à la ligne 95 cf mon message d'erreurs "too many arguments ":
--> y a-t-il trop de fichiers dans le répertoire??
--> la commande est-elle inexacte ??
Visiblement (cf. les annotations) il faudrait utiliser la commande xargs ???
cela dépasse mes compétences: lire du code, ok, mais le corriger, c'est plus dur !!
Oui, il est possible qu'il y ait trop de fichiers. C'est pourquoi tu as ce message... Essaye sur des petits nombres de fichiers (et sauvegarde-les quelquepart avant...)
Too many arguments
En général il s'agit soit d'une erreur dans un test avec une variable non initialisée ou ce qui semble être le cas une ligne de commande trop longue pour être traitée.
La cause doit être la boucle ci-contre :
for fic in * .* ; do
ce qui correspond à la liste de tous les fichiers (avec les fichiers cachés .*) de tout le répertoire.
Solution qui devrait marcher, remplacer la boucle comme ceci :
for fic in * .* | xargs ; do
La commande xargs permet d'évaluer les arguments un à un, ce qui règle ce type de problème.
Pas sur ma machine pour vérifier, mais ça doit venir de la forme abrégée du for.
Utilise dans ce cas for fic in `ls * .* | xargs` ; do je pense que ça règlera l'erreur.
Autrement, une autre solution radicale, créer une liste des fichiers (de préférence dans un fichier situé dans un autre répertoire, genre /tmp) pour que celle liste n'apparaisse pas dans la liste des fichiers à traiter, et prend en source de la boucle for.
Cela donne cela en code :
ls * .* > /tmp/MaListe
while read fic ; do
# Traitement des fichiers
done < /tmp/MaListe
Il faut comprendre le code ainsi, une boucle while qui exécute un read à chaque ligne du fichier qui est pris en entrée (done < /tmp/MaListe) et qui stocke la ligne lue dans la variable fic.
merci pour les corrections.
Comme je le mettais ici : http://forum.club.mandriva.com/viewtopic.php?t=53978&start=25
j'avais rencontré des soucis avec ce script.
Dès que j'ai un peu de temps je mets sur mon site la version corrigée avec vos conseils.
Merci à cibou 57 d'avoir relancé le sujet.
Le read est toujours radical quand on traite une liste trop longue.
Et pourtant, la longueur maxi de la ligne de commande sous linux est vraiment impressionnante, mais on arrive parfois aux limites.
Cette technique marche aussi pour lire dans plusieurs variables les différents champs d'un fichier texte (séparés par une tabulation ou une espace, ou si on modifie la variable IFS par un tout autre caractère).
j'ai corrigé mon script convertEnc.sh en prenant en compte :
- le debug sur les listes de fichiers trop longues (merci JacquesF)
- prise en compte du statut réussite ou échec de la commande iconv (qui fait le boulot de conversion) pour décider de remplacer ou nom l'ancien fichier par le nouveau.
En tant qu'utilisateur de base j'ai essayé de suivre le super tuto de sebde à la lettre.
J'ai un probleme pour commencer car j'essaye d'installer iconv via un rpm mais je ne le trouve pas (le urpmi iconv me renvoi une liste avec des php-iconv, et autre psi-iconv mais pas le bon) . Rien sur rpmfind.net ni sur rpm.pbone.net ???
J'en profite pour signaler le l'article indique de charger conmv au lieu de convmv . Je sais c'est idiot mais autant être
Une autre suggestion d'amelioration serait de rajouter dans quel depot (contrib.release ou main.updates par exemple ) se trouve iconv / convmv
Le fichier /usr/bin/iconv est livré par le paquet glibc-2.3.6-4.1.20060mdk (sur ma Mandriva 2006, pour les autres dans la glibc de la version).
Il doit être présent sur ta machine, vérifie dans le répertoire /usr/bin
Dans la dernière version et avec les corrections que j'avais faites, le script donné par Seb fonctionnait à priori sans soucis, que ce soient le nombre ou la présence d'espaces dans le nom.
Vérifie que le fichier script est bien à la dernière version, sinon le problème se situe à chaque fois qu'on référence la variable désignant le fichier, il faut la mettre entre guillemets (seul problème possible, un nom de fichier possédant un guillemet).
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum