#26 Le 04/11/2009, à 21:19
- Lapogne71
Re : [Script] pour renommer les fichiers avec problèmes d'accents
Salut,
les man pages du site officiel peuvent aider je pense:
http://www.j3e.de/linux/convmv/man/
D'ailleurs il y a des version plus évolué que celle que tu propose, as tu reprit le dernier script en date et traduit celui-ci en francais ?
http://www.j3e.de/linux/convmv/
C'était au cas ou.
Bye.
Je pense que la version actuelle 1.12 dans Karmic est suffisante pour ce qui est demandé par ce script. II y aurait bien sûr beaucoup d'autres cas à prendre en compte, mais ce n'était pas le but premier de mon script, que j'ai écrit "vite fait"
Hors ligne
#27 Le 05/11/2009, à 19:05
- Hizoka
Re : [Script] pour renommer les fichiers avec problèmes d'accents
bon apres quelques tests, iconv ne fonctionne pas avec les erreurs de caracteres, il me dit :
iconv: séquence d'échappement non permise à la position 44
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#28 Le 05/11/2009, à 22:11
- Lapogne71
Re : [Script] pour renommer les fichiers avec problèmes d'accents
bon apres quelques tests, iconv ne fonctionne pas avec les erreurs de caracteres, il me dit :
iconv: séquence d'échappement non permise à la position 44
En fait avec la commande :
iconv -f CP437 -t UTF-8 test.txt
on retrouve les bons accents, ce qui prouve qu'on pourrait effectivement réécrire le script en manipulant un fichier texte via l'outil "iconv" , puis les noms de fichiers. Si j'ai le temps je me pencherais dessus, mais pour l'instant celui avec "convmv" fonctionne bien
Hors ligne
#29 Le 06/11/2009, à 08:56
- Hizoka
Re : [Script] pour renommer les fichiers avec problèmes d'accents
moi ça me donne ça :
01 Le Marchand de Grenouilles.txt
05 L'arrivΘe de Franτois d'α c⌠tΘ.txt
convmv-for-utf-8_0.03.sh
PΘpΘ-α-la-fΩte
test1.txt
Toto-a-la-fete
si j'arrive à le faire fonctionner à peu près comme il faut je veux bien t'aider
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#30 Le 06/11/2009, à 11:21
- Lapogne71
Re : [Script] pour renommer les fichiers avec problèmes d'accents
si j'arrive à le faire fonctionner à peu près comme il faut je veux bien t'aider
OK je t'envoie un msg par email
Hors ligne
#31 Le 06/11/2009, à 16:46
- Hizoka
Re : [Script] pour renommer les fichiers avec problèmes d'accents
hizoka@hizo-pc:~/Download/fichier_test_accents$ ls -1
01 Le Marchand de Grenouilles.txt
05 L'arriv?e de Fran?ois d'? c?t?.txt
convmv-for-utf-8_0.03.sh
P?p?-?-la-f?te
Toto-a-la-fete
hizoka@hizo-pc:~/Download/fichier_test_accents$ ls > txt1.txt
hizoka@hizo-pc:~/Download/fichier_test_accents$ cat txt1.txt
01 Le Marchand de Grenouilles.txt
05 L'arriv�e de Fran�ois d'� c�t�.txt
convmv-for-utf-8_0.03.sh
P�p�-�-la-f�te
Toto-a-la-fete
txt1.txt
hizoka@hizo-pc:~/Download/fichier_test_accents$ iconv -f CP437 -t UTF-8 -o txt2.txt txt1.txt
hizoka@hizo-pc:~/Download/fichier_test_accents$ cat txt2.txt
01 Le Marchand de Grenouilles.txt
05 L'arrivΘe de Franτois d'α c⌠tΘ.txt
convmv-for-utf-8_0.03.sh
PΘpΘ-α-la-fΩte
Toto-a-la-fete
txt1.txt
Voila donc ce qu'il se passe avec incov
hizoka@hizo-pc:~/Download/fichier_test_accents$ bash convmv-for-utf-8_0.03.sh
convmv-for-utf-8_0.03.sh v0.03
Vérifier quel codage d'origine semble correct (presser 'y' et validez si affichage en attente)
--- Hypothèse du codage : iso-8859-1 ---
Noms de fichiers originaux codés en iso-8859-1 :
05 L'arriv�e de Fran�ois d'� c�t�.txt
P�p�-�-la-f�te
Noms de fichiers convertis en UTF-8 :
05 L'arrivée de François d'à côté.txt
Pépé-à-la-fête
Codage trouvé ? [N]on / oui / quitter : o
Convertir maintenant les noms de fichier depuis le codage iso-8859-1 ?
==> convmv -f iso-8859-1 -t utf-8 * --notest
Confirmer la conversion [N]on / oui / récursif : o
Your Perl version has fleas #37757 #49830
mv "./05 L'arriv�e de Fran�ois d'� c�t�.txt" "./05 L'arrivée de François d'à côté.txt"
mv "./P�p�-�-la-f�te" "./Pépé-à-la-fête"
Conversion des noms de fichiers effectuée ...
et voila avec ton script de base.
Pour les fichiers, je n'en ai pas en ce moment donc j'utilise ton zip de test.
Je veux bien que tu me renvoies tes résultats avec inconv stp .
Dernière modification par Hizoka (Le 06/11/2009, à 16:50)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#32 Le 09/11/2009, à 17:29
- Hizoka
Re : [Script] pour renommer les fichiers avec problèmes d'accents
as tu eu le temps de retester ?
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#33 Le 09/11/2009, à 22:25
- Lapogne71
Re : [Script] pour renommer les fichiers avec problèmes d'accents
as tu eu le temps de retester ?
non pas vraiment !
La seule chose que j'ai eu le temps de tester, c'est que le codage utilisé pour mon exemple fichier_test_accents.zip est détecté comme CP437 sur Ubuntu Karmic et comme ISO-8859-1 sur Debian 5.03 ! et ce aussi bien avec iconv que convmv ...
--> ce qui explique peut-être les différences entre tes tests et les miens.
Je me demande qu'est ce qui fait cette différence de résultats, sachant que la commande "locale" retourne exactement la même chose sur les deux systèmes.
Maintenant pour remplacer l'outil convmv par iconv dans mon script, je suis ouvert à tes propositions de code !
car pour le moment je n'aurais pas le temps de le modifier
Hors ligne
#34 Le 10/11/2009, à 16:05
- Hizoka
Re : [Script] pour renommer les fichiers avec problèmes d'accents
bah en fait je suis bloqué par l'utilisation de iconv actuellement n'arrivant pas à trouver le bon codage sous karmic qui m'afficherait le bon résultat...
pour le code, je pense que je pourrais faire quelque chose relativement rapidement apres.
Edit :
sous mon karmic c'est du : ISO-8859-1
ok je vais pouvoir faire quelques tests
quels sont les codages les plus utilisés ?
utf-8 ISO-8859-15....
Dernière modification par Hizoka (Le 10/11/2009, à 18:29)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#35 Le 10/11/2009, à 19:12
- Hizoka
Re : [Script] pour renommer les fichiers avec problèmes d'accents
Voici un script fonctionnel, surement possible de l'améliorer mais c'est déjà un chouille moins compliqué que le tiens je trouve.
#! /bin/bash
# Définition des couleurs pour echo -e
FUSHIA="\033[1;35m"
BLEUFONCE="\033[1;34m"
ROUGE="\033[1;31m"
NOIR="\033[1;0m"
# Suppression des fichiers txt s'ils existent
rm /tmp/liste_originale.txt /tmp/liste_corrige.txt /tmp/liste_erreur.txt &>/dev/null
# Utiliser l'argument lu par le script (-r)
while getopts ":rh" Option
# Déclaration initiale.
# r est l'options (indicateurs) attendue.
do
case $Option in
# Si c'est l'option -r alors on fait une recherche egalement dans les dossiers
r ) find "${PWD}" -mindepth 1 > /tmp/liste_originale.txt ;;
# Si c'est l'option -i alors voila quelques infos
h ) echo -e "\n${BLEUFONCE}Options disponibles :
-r : Traite récursivement le contenu des sous-répertoires. Si cela n'est pas utiliser, seul le dossier courant sera traité.${NOIR}\n" && exit 0 ;;
esac
done
shift $(($OPTIND – 1))
# Si le fichier n'existe pas ou est vide, dans le cas de non utilisation de l'option -r
if [[ ! -s /tmp/liste_originale.txt ]]
then
# Recherche uniquement dans le dossier actuel
find "${PWD}" -maxdepth 1 -mindepth 1 > /tmp/liste_originale.txt
fi
# Iconv test chaque format jusqu'à l'arret par l'utilisateur
for code in "iso-8859-1" "CP437" "iso-8859-2" "iso-8859-3" "iso-8859-4" "iso-8859-5" "iso-8859-6" "iso-8859-7" "iso-8859-8" "iso-8859-9" "iso-8859-10" "iso-8859-11" "iso-8859-13" "iso-8859-14" "iso-8859-15" "iso-8859-16" "cp737" "cp775" "cp850" "cp852" "cp855" "cp856" "cp857" "cp860" "cp861" "cp862" "cp863" "cp864" "cp865" "cp866" "cp869" "cp874" "cp932" "cp936" "cp949" "cp950" "cp1250" "cp1251" "cp1252" "cp1253" "cp1254" "cp1255" "cp1256" "cp1257" "cp1258"
do
# Annonce le format utilisé
echo -e "\n${BLEUFONCE}Test avec pour format original ${FUSHIA}${code}${NOIR}.\n"
# Iconv crée un nouveau fichier avec le nouveau codage
iconv -f ${code} -t UTF-8 /tmp/liste_originale.txt -o /tmp/liste_corrige.txt 2>/tmp/liste_erreur.txt
# Si le fichier d'erreur de iconv n'est pas vide, on saute la boucle en cours
if [[ -s /tmp/liste_erreur.txt ]]
then
# Annonce lque ce ne peut être ce format
echo -e "${ROUGE}Il est certain que ce n'est pas le codage : ${code}.${NOIR}"
# On saute ce format qui n'est pas le bon"
continue
fi
# Affichage du texte avec le nouveau codage
cat /tmp/liste_corrige.txt
# On demande confirmation du résultat par l'utilisateur
echo -e "\n${BLEUFONCE}Ce codage est-il le bon ?${NOIR}"
read -p "[O]ui/[N]on/[E]xit : " codage_ok
# Si l'utilisateur est ok avec le codage, on arrete la boucle
# Si la variable codage_ok commence par "O" ou "o", c'est bon
if [[ ${codage_ok} == [Oo]* ]]
then
# Arret de la boucle, on passe à la suite
break
elif [[ ${codage_ok} == [Ee]* ]]
then
# Suppression des fichiers txt
rm /tmp/liste_originale.txt /tmp/liste_corrige.txt /tmp/liste_erreur.txt
# Arret du script
exit 1
fi
done
# Si la boucle s'est terminée sans que l'utilisateur accepte l'encodage
if [[ ${codage_ok} != [Oo]* ]]
then
echo -e "\n${ROUGE}Le script n'a pas réussis à trouver le bon codage original.
Désolé mais le script s'arrete là.${NOIR}\n"
# Suppression des fichiers txt
rm /tmp/liste_originale.txt /tmp/liste_corrige.txt /tmp/liste_erreur.txt
# Arret du script
exit 1
fi
# Un petit saut de ligne :)
echo
# On passe liste_originale.txt dans une boucle le lisant ligne par ligne
cat /tmp/liste_originale.txt | while read nom
do
# Si la ligne (nom) est la même que dans le liste_originale.txt, pas besoin de modifier le fichier
if [[ -n $(grep "${nom}" /tmp/liste_corrige.txt) ]]
then
# Suppression de la 1ere ligne de liste_corrige.txt contenant le nom du fichier commun aux fichiers txt
sed -i "1d" /tmp/liste_corrige.txt
else
# Affiche l'ancien nom et le nouveau
echo -e "${BLEUFONCE}${nom}${NOIR} devient ${FUSHIA}$(head -1 /tmp/liste_corrige.txt)${NOIR}."
# Fichier renommé
mv "${nom}" "$(head -1 /tmp/liste_corrige.txt)"
# Suppression de la 1ere ligne de liste_corrige.txt contenant le nom du fichier qui vient d'être renommé
sed -i "1d" /tmp/liste_corrige.txt
fi
done
# Suppression des fichiers txt
rm /tmp/liste_originale.txt /tmp/liste_corrige.txt /tmp/liste_erreur.txt
# Arret du script
exit 0
Dernière modification par Hizoka (Le 10/11/2009, à 19:17)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#36 Le 11/11/2009, à 00:26
- Hizoka
Re : [Script] pour renommer les fichiers avec problèmes d'accents
voici la dernière version normalement quasiment parfaite (heureusement que je ne suis pas chaussé...:P )
#! /bin/bash
# Définition des couleurs pour echo -e
FUSHIA="\033[1;35m"
BLEUFONCE="\033[1;34m"
ROUGE="\033[1;31m"
NOIR="\033[1;0m"
# Suppression des fichiers txt s'ils existent
rm /tmp/liste_originale.txt /tmp/liste_corrige.txt /tmp/liste_erreur.txt &>/dev/null
# Utiliser les arguments lu par le script (-r et -h)
while getopts ":rh" Option
# Déclaration initiale.
# r et h sont les options (indicateurs) attendues.
do
case $Option in
# Si c'est l'option -r alors on fait une recherche egalement dans les dossiers
r ) find "${PWD}" -depth > /tmp/liste_originale.txt ;;
# Si c'est l'option -i alors voila quelques infos
h ) echo -e "\n${BLEUFONCE}Options disponibles :
-r : Traite récursivement le contenu des sous-répertoires. Si cela n'est pas utiliser, seul le dossier courant sera traité.${NOIR}\n" && exit 0 ;;
# SI l'option n'existe pas, arrêt du script
* ) echo -e "\n${ROUGE}Option indisponible, arret du script !${NOIR}\n" && exit 1 ;;
esac
done
shift $(($OPTIND - 1))
# Si le fichier n'existe pas ou est vide, dans le cas de non utilisation de l'option -r
if [[ ! -s /tmp/liste_originale.txt ]]
then
# Recherche uniquement dans le dossier actuel
find "${PWD}" -depth > /tmp/liste_originale.txt
fi
# Iconv test chaque format jusqu'à l'arret par l'utilisateur
for code in "iso-8859-1" "CP437" "iso-8859-2" "iso-8859-3" "iso-8859-4" "iso-8859-5" "iso-8859-6" "iso-8859-7" "iso-8859-8" "iso-8859-9" "iso-8859-10" "iso-8859-11" "iso-8859-13" "iso-8859-14" "iso-8859-15" "iso-8859-16" "cp737" "cp775" "cp850" "cp852" "cp855" "cp856" "cp857" "cp860" "cp861" "cp862" "cp863" "cp864" "cp865" "cp866" "cp869" "cp874" "cp932" "cp936" "cp949" "cp950" "cp1250" "cp1251" "cp1252" "cp1253" "cp1254" "cp1255" "cp1256" "cp1257" "cp1258"
do
# Annonce le format utilisé
echo -e "\n${BLEUFONCE}Test avec pour format original ${FUSHIA}${code}${NOIR}.\n"
# Iconv crée un nouveau fichier avec le nouveau codage
iconv -f ${code} -t UTF-8 /tmp/liste_originale.txt -o /tmp/liste_corrige.txt 2>/tmp/liste_erreur.txt
# Si le fichier d'erreur de iconv n'est pas vide, on saute la boucle en cours
if [[ -s /tmp/liste_erreur.txt ]]
then
# Annonce lque ce ne peut être ce format
echo -e "${ROUGE}Il est certain que ce n'est pas le codage : ${code}.${NOIR}"
# On saute ce format qui n'est pas le bon"
continue
fi
# Affichage du texte avec le nouveau codage
cat /tmp/liste_corrige.txt
# On demande confirmation du résultat par l'utilisateur
echo -e "\n${BLEUFONCE}Ce codage est-il le bon ?${NOIR}"
read -p "[O]ui/[N]on/[E]xit : " codage_ok
# Si l'utilisateur est ok avec le codage, on arrete la boucle
# Si la variable codage_ok commence par "O" ou "o", c'est bon
if [[ ${codage_ok} == [Oo]* ]]
then
# Arret de la boucle, on passe à la suite
break
elif [[ ${codage_ok} == [Ee]* ]]
then
# Suppression des fichiers txt
rm /tmp/liste_originale.txt /tmp/liste_corrige.txt /tmp/liste_erreur.txt
# Arret du script
exit 1
fi
done
# Si la boucle s'est terminée sans que l'utilisateur accepte l'encodage
if [[ ${codage_ok} != [Oo]* ]]
then
echo -e "\n${ROUGE}Le script n'a pas réussis à trouver le bon codage original.
Désolé mais le script s'arrete là.${NOIR}\n"
# Suppression des fichiers txt
rm /tmp/liste_originale.txt /tmp/liste_corrige.txt /tmp/liste_erreur.txt
# Arret du script
exit 1
fi
# Un petit saut de ligne :)
echo
# Traite les adresses complétes origineles 1 par 1
cat /tmp/liste_originale.txt | while read nom
do
# Récupération de l'adresse du fichier
adresse_origine=${nom%/*}
# Récupération du nom du fichier
nom_origine=${nom##*/}
# Récupération de l'adresse compléte
corrige=$(head -1 /tmp/liste_corrige.txt)
# Récupération du nouveau nom du fichier
nom_corrige=${corrige##*/}
# Si les 2 noms sont différents
if [[ "${nom_origine}" != "${nom_corrige}" ]]
then
# Affiche l'ancienne adresse et la nouvelle
echo -e "${BLEUFONCE}${nom}${NOIR} devient ${FUSHIA}${adresse_origine}/${nom_corrige}${NOIR}."
# Renomme le fichier avec le nouveau nom
mv "${nom}" "${adresse_origine}"/"${nom_corrige}"
fi
# On supprime la ligne venant d'être lue, la 1ere
sed -i "1d" /tmp/liste_corrige.txt
done
# Suppression des fichiers txt
rm /tmp/liste_originale.txt /tmp/liste_corrige.txt /tmp/liste_erreur.txt
# Arret du script
exit 0
Il vous suffit de
1 - copier le code dans un fichier
2 - mettre ce fichier dans le dossier à traiter
3 - de lancer celui-ci via un :
bash nom-du-fichier
les options :
-r : Traite les sous-dossiers également
-h : très peu d'infos.
Si le script est lancé sans -r, il ne traitera que les fichiers/dossiers présents dans le dossier courant.
Exemple :
bash hizoka.sh -r
/home/hizoka/Download/fichier_test_accents/Toto-a-la-fete/05 L'arrivée de François d'à côté.txt
/home/hizoka/Download/fichier_test_accents/Toto-a-la-fete/01 Le Marchand de Grenouilles.txt
/home/hizoka/Download/fichier_test_accents/05 L'arrivée de François d'à côté.txt
/home/hizoka/Download/fichier_test_accents/convmv-for-utf-8_0.03.sh
/home/hizoka/Download/fichier_test_accents/01 Le Marchand de Grenouilles.txt
/home/hizoka/Download/fichier_test_accents/bash.sh
/home/hizoka/Download/fichier_test_accents/Pépé-à-la-fête/05 L'arrivée de François d'à côté.txt
/home/hizoka/Download/fichier_test_accents/Pépé-à-la-fête/01 Le Marchand de Grenouilles.txt
/home/hizoka/Download/fichier_test_accents/Toto-a-la-fete
/home/hizoka/Download/fichier_test_accents/Pépé-à-la-fête
bash Hizoka.sh
/home/hizoka/Download/fichier_test_accents/05 L'arrivée de François d'à côté.txt
/home/hizoka/Download/fichier_test_accents/convmv-for-utf-8_0.03.sh
/home/hizoka/Download/fichier_test_accents/01 Le Marchand de Grenouilles.txt
/home/hizoka/Download/fichier_test_accents/bash.sh
/home/hizoka/Download/fichier_test_accents/Toto-a-la-fete
/home/hizoka/Download/fichier_test_accents/Pépé-à-la-fête
Dernière modification par Hizoka (Le 11/11/2009, à 09:59)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#37 Le 11/11/2009, à 10:59
- Hizoka
Re : [Script] pour renommer les fichiers avec problèmes d'accents
Nouvelle version
#! /bin/bash
# Définition des couleurs pour echo -e
FUSHIA="\033[1;35m"
BLEUFONCE="\033[1;34m"
ROUGE="\033[1;31m"
NOIR="\033[1;0m"
# Utiliser les arguments lu par le script
while getopts ":arfh" Option
do
case $Option in
# Si c'est l'option -a (all) alors on vérifie également le nom du dossier dans lequel on se trouve
a ) arg_a="0" ;;
# Pour limiter la recherche uniquement au contenu du dossier et non aux sous dossiers
r ) arg_r="-maxdepth 1" ;;
# Si c'est l'option -f alors on ne fait une recherche que sur les fichiers
f ) arg_f="-type f" ;;
# Si c'est l'option -i alors voila quelques infos
h ) echo -e "\n${FUSHIA}Options disponibles :
${FUSHIA}-a : ${BLEUFONCE}Permet de traiter également le nom du dossier courant. ${FUSHIA}Inutile avec -f.
${FUSHIA}-r : ${BLEUFONCE}Ne traite pas les sous dossiers, ne traite que les éléments présents dans le dossier courant.
${FUSHIA}-f : ${BLEUFONCE}Permet de ne traiter que les fichiers sans traiter les dossiers. ${FUSHIA}Inutile avec -a.${NOIR}\n" && exit 0 ;;
# SI l'option n'existe pas, arrêt du script
* ) echo -e "\n${ROUGE}Option indisponible, arret du script !${NOIR}\n" && exit 1 ;;
esac
done
shift $(($OPTIND - 1))
echo -e "${BLEUFONCE}Pour plus d'informations, utilisez l'option ${FUSHIA}-h${NOIR}."
sleep 1
# 1 - Recherche dans le dossier actuel
# 2 - Recherche d'abord les sous-fichiers
# 3 - Verifie arg_a, si indisponible alors cela sera : -mindepth 1
# 4 - Utilise arg_r si activé pour limité la recherche au dossier actuel sans les sous dossiers
# 5 - Utilise arg_f si activé pour limité la recherche aux fichiers
# find "${PWD}" -depth -mindepth -maxdepth -type
find "${PWD}" -depth -mindepth ${arg_a:-1} ${arg_r} ${arg_f} > /tmp/liste_originale.txt
# Iconv test chaque format jusqu'à l'arret par l'utilisateur
for code in "iso-8859-1" "CP437" "iso-8859-2" "iso-8859-3" "iso-8859-4" "iso-8859-5" "iso-8859-6" "iso-8859-7" "iso-8859-8" "iso-8859-9" "iso-8859-10" "iso-8859-11" "iso-8859-13" "iso-8859-14" "iso-8859-15" "iso-8859-16" "cp737" "cp775" "cp850" "cp852" "cp855" "cp856" "cp857" "cp860" "cp861" "cp862" "cp863" "cp864" "cp865" "cp866" "cp869" "cp874" "cp932" "cp936" "cp949" "cp950" "cp1250" "cp1251" "cp1252" "cp1253" "cp1254" "cp1255" "cp1256" "cp1257" "cp1258"
do
# Annonce le format utilisé
echo -e "\n${BLEUFONCE}Test avec pour format original ${FUSHIA}${code}${NOIR}.\n"
# Iconv crée un nouveau fichier avec le nouveau codage
iconv -f ${code} -t UTF-8 /tmp/liste_originale.txt -o /tmp/liste_corrige.txt 2>/tmp/liste_erreur.txt
# Si le fichier d'erreur de iconv n'est pas vide, on saute la boucle en cours
if [[ -s /tmp/liste_erreur.txt ]]
then
# Annonce lque ce ne peut être ce format
echo -e "${ROUGE}Il est certain que ce n'est pas le codage : ${code}.${NOIR}"
# On saute ce format qui n'est pas le bon"
continue
fi
# Affichage du texte avec le nouveau codage
cat /tmp/liste_corrige.txt
# On demande confirmation du résultat par l'utilisateur
echo -e "\n${BLEUFONCE}Ce codage est-il le bon ?${NOIR}"
read -p "[O]ui/[N]on/[E]xit : " codage_ok
# Si l'utilisateur est ok avec le codage, on arrete la boucle
# Si la variable codage_ok commence par "O" ou "o", c'est bon
if [[ ${codage_ok} == [Oo]* ]]
then
# Arret de la boucle, on passe à la suite
break
elif [[ ${codage_ok} == [Ee]* ]]
then
# Suppression des fichiers txt
rm /tmp/liste_originale.txt /tmp/liste_corrige.txt /tmp/liste_erreur.txt
# Arret du script
exit 1
fi
done
# Si la boucle s'est terminée sans que l'utilisateur accepte l'encodage
if [[ ${codage_ok} != [Oo]* ]]
then
echo -e "\n${ROUGE}Le script n'a pas réussis à trouver le bon codage original.
Désolé mais le script s'arrete là.${NOIR}\n"
# Suppression des fichiers txt
rm /tmp/liste_originale.txt /tmp/liste_corrige.txt /tmp/liste_erreur.txt
# Arret du script
exit 1
fi
# Un petit saut de ligne :)
echo
# Traite les adresses complétes origineles 1 par 1
cat /tmp/liste_originale.txt | while read nom
do
# Récupération de l'adresse du fichier
adresse_origine=${nom%/*}
# Récupération du nom du fichier
nom_origine=${nom##*/}
# Récupération de l'adresse compléte
corrige=$(head -1 /tmp/liste_corrige.txt)
# Récupération du nouveau nom du fichier
nom_corrige=${corrige##*/}
# Si les 2 noms sont différents
if [[ "${nom_origine}" != "${nom_corrige}" ]]
then
# Affiche l'ancienne adresse et la nouvelle
echo -e "${BLEUFONCE}${nom}${NOIR} devient ${FUSHIA}${adresse_origine}/${nom_corrige}${NOIR}."
# Renomme le fichier avec le nouveau nom
mv "${nom}" "${adresse_origine}"/"${nom_corrige}"
fi
# On supprime la ligne venant d'être lue, la 1ere
sed -i "1d" /tmp/liste_corrige.txt
done
# Suppression des fichiers txt
rm /tmp/liste_originale.txt /tmp/liste_corrige.txt /tmp/liste_erreur.txt
# Arret du script
exit 0
Explications :
1 - coller le code dans un fichier.sh
2 - mettre ce fichier dans le dossier à traiter
3 - de lancer celui-ci via un :
bash nom-du-fichier.sh
4 - De base la recherche se fera de façon récursive et sur tout type d'élément (dossier et fichier) mais sans prendre en compte le nom du dossier courant (ne le modifiera pas).
5 - Explications si besoin avec l'option -h
Exemples :
-a : Permet de traiter également le nom du dossier courant. Inutile avec -f.
-r : Ne traite pas les sous dossiers, ne traite que les éléments présents dans le dossier courant.
-f : Permet de ne traiter que les fichiers sans traiter les dossiers. Inutile avec -a..
/home/hizoka/Download/fichier_test_accents/Toto-a-la-fete/05 L'arrivée de François d'à côté.txt
/home/hizoka/Download/fichier_test_accents/Toto-a-la-fete/01 Le Marchand de Grenouilles.txt
/home/hizoka/Download/fichier_test_accents/Toto-a-la-fete
/home/hizoka/Download/fichier_test_accents/05 L'arrivée de François d'à côté.txt
/home/hizoka/Download/fichier_test_accents/convmv-for-utf-8_0.03.sh
/home/hizoka/Download/fichier_test_accents/01 Le Marchand de Grenouilles.txt
/home/hizoka/Download/fichier_test_accents/bash.sh
/home/hizoka/Download/fichier_test_accents/Pépé-à-la-fête/05 L'arrivée de François d'à côté.txt
/home/hizoka/Download/fichier_test_accents/Pépé-à-la-fête/01 Le Marchand de Grenouilles.txt
/home/hizoka/Download/fichier_test_accents/Pépé-à-la-fête
/home/hizoka/Download/fichier_test_accents/Toto-a-la-fete/05 L'arrivée de François d'à côté.txt
/home/hizoka/Download/fichier_test_accents/Toto-a-la-fete/01 Le Marchand de Grenouilles.txt
/home/hizoka/Download/fichier_test_accents/05 L'arrivée de François d'à côté.txt
/home/hizoka/Download/fichier_test_accents/convmv-for-utf-8_0.03.sh
/home/hizoka/Download/fichier_test_accents/01 Le Marchand de Grenouilles.txt
/home/hizoka/Download/fichier_test_accents/bash.sh
/home/hizoka/Download/fichier_test_accents/Pépé-à-la-fête/05 L'arrivée de François d'à côté.txt
/home/hizoka/Download/fichier_test_accents/Pépé-à-la-fête/01 Le Marchand de Grenouilles.txt
/home/hizoka/Download/fichier_test_accents/Toto-a-la-fete
/home/hizoka/Download/fichier_test_accents/05 L'arrivée de François d'à côté.txt
/home/hizoka/Download/fichier_test_accents/convmv-for-utf-8_0.03.sh
/home/hizoka/Download/fichier_test_accents/01 Le Marchand de Grenouilles.txt
/home/hizoka/Download/fichier_test_accents/bash.sh
/home/hizoka/Download/fichier_test_accents/Pépé-à-la-fête
/home/hizoka/Download/fichier_test_accents/05 L'arrivée de François d'à côté.txt
/home/hizoka/Download/fichier_test_accents/convmv-for-utf-8_0.03.sh
/home/hizoka/Download/fichier_test_accents/01 Le Marchand de Grenouilles.txt
/home/hizoka/Download/fichier_test_accents/bash.sh
/home/hizoka/Download/fichier_test_accents/Toto-a-la-fete/05 L'arrivée de François d'à côté.txt
/home/hizoka/Download/fichier_test_accents/Toto-a-la-fete/01 Le Marchand de Grenouilles.txt
/home/hizoka/Download/fichier_test_accents/Toto-a-la-fete
/home/hizoka/Download/fichier_test_accents/05 L'arrivée de François d'à côté.txt
/home/hizoka/Download/fichier_test_accents/convmv-for-utf-8_0.03.sh
/home/hizoka/Download/fichier_test_accents/01 Le Marchand de Grenouilles.txt
/home/hizoka/Download/fichier_test_accents/bash.sh
/home/hizoka/Download/fichier_test_accents/Pépé-à-la-fête/05 L'arrivée de François d'à côté.txt
/home/hizoka/Download/fichier_test_accents/Pépé-à-la-fête/01 Le Marchand de Grenouilles.txt
/home/hizoka/Download/fichier_test_accents/Pépé-à-la-fête
/home/hizoka/Download/fichier_test_accents
/home/hizoka/Download/fichier_test_accents/Toto-a-la-fete
/home/hizoka/Download/fichier_test_accents/05 L'arrivée de François d'à côté.txt
/home/hizoka/Download/fichier_test_accents/convmv-for-utf-8_0.03.sh
/home/hizoka/Download/fichier_test_accents/01 Le Marchand de Grenouilles.txt
/home/hizoka/Download/fichier_test_accents/bash.sh
/home/hizoka/Download/fichier_test_accents/Pépé-à-la-fête
/home/hizoka/Download/fichier_test_accents
Voici une nouvelle version du zip de test : Contient plus de sous dossiers.
Le zip contient les fichiers de test ainsi que mon script (hizoka) et celui de Lapogne71.
En testant vous verrez qu'ils font la même chose à la différence que le mien ne nécessite normalement aucune installation de paquet supplémentaire.
Dernière modification par Hizoka (Le 11/11/2009, à 11:04)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#38 Le 11/11/2009, à 23:52
- Lapogne71
Re : [Script] pour renommer les fichiers avec problèmes d'accents
@ hizoka :
Je me suis permis de mettre en avant ton script sur le post d'origine, contactes-moi par email si tu veux apporter des corrections au post
Hors ligne
#39 Le 12/11/2009, à 01:05
- Hizoka
Re : [Script] pour renommer les fichiers avec problèmes d'accents
Avantages : - fonctionne tel quel sans besoin d'installer d'autre outil
- très efficace pour les traitements non récursifs ==> à utiliser de préférence pour traiter un dossier sans sous-dossiers
Inconvénients : - l'outil utilisé 'iconv' ne différencie pas les noms de fichiers "valides avec accents" des noms de fichiers "invalides" ==> il modifiera les noms de fichiers avec accents même si ceux-ci sont corrects ==> attention à bien vérifier que votre dossier soit homogène
Je pige pas :
- Pourquoi pour les fichiers non récursif ? il marche très bien pour les sous dossiers également.
- il ne modifie pas les fichiers qui n'ont pas de fautes
explications :
il a 2 fichiers :
- ls original
- ls corrigé
- il supprime toutes les lignes que ces 2 fichiers ont en commun, ils ne touche donc que les fichiers avec erreurs.
Il est vrai qu'il affiche toutes les lignes avec ou sans faute, de ce fait je vais voir a faire la comparaison avant d'afficher le résultat lors
(Je cherche en particulier à pouvoir afficher en couleur les différences trouvées entre le codage d'origine et l'UTF-8, si quelqu'un peut m'aider sur ce point....)
je vais voir ça alors
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#40 Le 12/11/2009, à 01:44
- Hizoka
Re : [Script] pour renommer les fichiers avec problèmes d'accents
Voila une version qui ne montre que les fichier à modifier
et seuls les noms des fichiers/dossiers sont donné par :
ancien nom devient nouveau nom :
05 L'arriv�e de Fran�ois d'� c�t�.txt devient 05 L'arrivée de François d'à côté.txt.
P�p�-�-la-f�te devient Pépé-à-la-fête.
#! /bin/bash
# Définition des couleurs pour echo -e
FUSHIA="\033[1;35m"
BLEUFONCE="\033[1;34m"
ROUGE="\033[1;31m"
NOIR="\033[1;0m"
# Utiliser les arguments lu par le script
while getopts ":arfh" Option
do
case $Option in
# Si c'est l'option -a (all) alors on vérifie également le nom du dossier dans lequel on se trouve
a ) arg_a="0" ;;
# Pour limiter la recherche uniquement au contenu du dossier et non aux sous dossiers
r ) arg_r="-maxdepth 1" ;;
# Si c'est l'option -f alors on ne fait une recherche que sur les fichiers
f ) arg_f="-type f" ;;
# Si c'est l'option -i alors voila quelques infos
h ) echo -e "\n${FUSHIA}Options disponibles :
${FUSHIA}-a : ${BLEUFONCE}Permet de traiter également le nom du dossier courant. ${FUSHIA}Inutile avec -f.
${FUSHIA}-r : ${BLEUFONCE}Ne traite pas les sous dossiers, ne traite que les éléments présents dans le dossier courant.
${FUSHIA}-f : ${BLEUFONCE}Permet de ne traiter que les fichiers sans traiter les dossiers. ${FUSHIA}Inutile avec -a.${NOIR}\n" && exit 0 ;;
# SI l'option n'existe pas, arrêt du script
* ) echo -e "\n${ROUGE}Option indisponible, arret du script !${NOIR}\n" && exit 1 ;;
esac
done
shift $(($OPTIND - 1))
echo -e "${BLEUFONCE}Pour plus d'informations, utilisez l'option ${FUSHIA}-h${NOIR}."
sleep 1
# 1 - Recherche dans le dossier actuel
# 2 - Recherche d'abord les sous-fichiers
# 3 - Verifie arg_a, si indisponible alors cela sera : -mindepth 1
# 4 - Utilise arg_r si activé pour limité la recherche au dossier actuel sans les sous dossiers
# 5 - Utilise arg_f si activé pour limité la recherche aux fichiers
# find "${PWD}" -depth -mindepth -maxdepth -type
find "${PWD}" -depth -mindepth ${arg_a:-1} ${arg_r} ${arg_f} > /tmp/liste_originale.txt
# Iconv test chaque format jusqu'à l'arret par l'utilisateur
for code in "iso-8859-1" "CP437" "iso-8859-2" "iso-8859-3" "iso-8859-4" "iso-8859-5" "iso-8859-6" "iso-8859-7" "iso-8859-8" "iso-8859-9" "iso-8859-10" "iso-8859-11" "iso-8859-13" "iso-8859-14" "iso-8859-15" "iso-8859-16" "cp737" "cp775" "cp850" "cp852" "cp855" "cp856" "cp857" "cp860" "cp861" "cp862" "cp863" "cp864" "cp865" "cp866" "cp869" "cp874" "cp932" "cp936" "cp949" "cp950" "cp1250" "cp1251" "cp1252" "cp1253" "cp1254" "cp1255" "cp1256" "cp1257" "cp1258"
do
# Annonce le format utilisé
echo -e "\n${BLEUFONCE}Test avec pour format original ${FUSHIA}${code}${NOIR}.\n"
# Iconv crée un nouveau fichier avec le nouveau codage
iconv -f ${code} -t UTF-8 /tmp/liste_originale.txt -o /tmp/liste_corrige.txt 2>/tmp/liste_erreur.txt
# Si le fichier d'erreur de iconv n'est pas vide, on saute la boucle en cours
if [[ -s /tmp/liste_erreur.txt ]]
then
# Annonce lque ce ne peut être ce format
echo -e "${ROUGE}Il est certain que ce n'est pas le codage : ${code}.${NOIR}"
# On saute ce format qui n'est pas le bon"
continue
fi
# Compare les 2 fichiers et y supprime les lignes identiques dans les 2 fichiers
cat /tmp/liste_originale.txt | while read ligne
do
fichier="${ligne##*/}"
if [[ -n $(egrep "${fichier}$" /tmp/liste_corrige.txt) ]]
then
sed -i "/${fichier}$/d" /tmp/liste_corrige.txt
sed -i "/${fichier}$/d" /tmp/liste_originale.txt
fi
done
# Affichage du texte avec le nouveau codage
cat /tmp/liste_corrige.txt
# On demande confirmation du résultat par l'utilisateur
echo -e "\n${BLEUFONCE}Ce codage est-il le bon ?${NOIR}"
read -p "[O]ui/[N]on/[E]xit : " codage_ok
# Si l'utilisateur est ok avec le codage, on arrete la boucle
# Si la variable codage_ok commence par "O" ou "o", c'est bon
if [[ ${codage_ok} == [Oo]* ]]
then
# Arret de la boucle, on passe à la suite
break
elif [[ ${codage_ok} == [Ee]* ]]
then
# Suppression des fichiers txt
rm /tmp/liste_originale.txt /tmp/liste_corrige.txt /tmp/liste_erreur.txt
# Arret du script
exit 1
fi
done
# Si la boucle s'est terminée sans que l'utilisateur accepte l'encodage
if [[ ${codage_ok} != [Oo]* ]]
then
echo -e "\n${ROUGE}Le script n'a pas réussis à trouver le bon codage original.
Désolé mais le script s'arrete là.${NOIR}\n"
# Suppression des fichiers txt
rm /tmp/liste_originale.txt /tmp/liste_corrige.txt /tmp/liste_erreur.txt
# Arret du script
exit 1
fi
# Un petit saut de ligne :)
echo
# Traite les adresses complétes origineles 1 par 1
cat /tmp/liste_originale.txt | while read nom
do
# Récupération de l'adresse du fichier
adresse_origine=${nom%/*}
# Récupération du nom du fichier
nom_origine=${nom##*/}
# Récupération de l'adresse compléte
corrige=$(head -1 /tmp/liste_corrige.txt)
# Récupération du nouveau nom du fichier
nom_corrige=${corrige##*/}
# Si les 2 noms sont différents
if [[ "${nom_origine}" != "${nom_corrige}" ]]
then
# Affiche l'ancienne adresse et la nouvelle
echo -e "${BLEUFONCE}${nom_origine}${NOIR} devient ${FUSHIA}${nom_corrige}${NOIR}."
# Renomme le fichier avec le nouveau nom
mv "${nom}" "${adresse_origine}"/"${nom_corrige}"
fi
# On supprime la ligne venant d'être lue, la 1ere
sed -i "1d" /tmp/liste_corrige.txt
done
# Suppression des fichiers txt
rm /tmp/liste_originale.txt /tmp/liste_corrige.txt /tmp/liste_erreur.txt
# Arret du script
exit 0
Si tu vois autre chose
Dernière modification par Hizoka (Le 12/11/2009, à 01:45)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#41 Le 12/11/2009, à 03:29
- Hizoka
Re : [Script] pour renommer les fichiers avec problèmes d'accents
Quelle idée à la con de mettre de la couleur sur les différences
après 1h30 de test :
#! /bin/bash
# Définition des couleurs pour echo -e
FUSHIA="\033[1;35m"
BLEUFONCE="\033[1;34m"
ROUGE="\033[1;31m"
NOIR="\033[1;0m"
# Utiliser les arguments lu par le script
while getopts ":arfh" Option
do
case $Option in
# Si c'est l'option -a (all) alors on vérifie également le nom du dossier dans lequel on se trouve
a ) arg_a="0" ;;
# Pour limiter la recherche uniquement au contenu du dossier et non aux sous dossiers
r ) arg_r="-maxdepth 1" ;;
# Si c'est l'option -f alors on ne fait une recherche que sur les fichiers
f ) arg_f="-type f" ;;
# Si c'est l'option -i alors voila quelques infos
h ) echo -e "\n${FUSHIA}Options disponibles :
${FUSHIA}-a : ${BLEUFONCE}Permet de traiter également le nom du dossier courant. ${FUSHIA}Inutile avec -f.
${FUSHIA}-r : ${BLEUFONCE}Ne traite pas les sous dossiers, ne traite que les éléments présents dans le dossier courant.
${FUSHIA}-f : ${BLEUFONCE}Permet de ne traiter que les fichiers sans traiter les dossiers. ${FUSHIA}Inutile avec -a.${NOIR}\n" && exit 0 ;;
# SI l'option n'existe pas, arrêt du script
* ) echo -e "\n${ROUGE}Option indisponible, arret du script !${NOIR}\n" && exit 1 ;;
esac
done
shift $(($OPTIND - 1))
echo -e "${BLEUFONCE}Pour plus d'informations, utilisez l'option ${FUSHIA}-h${NOIR}."
sleep 1
# 1 - Recherche dans le dossier actuel
# 2 - Recherche d'abord les sous-fichiers
# 3 - Verifie arg_a, si indisponible alors cela sera : -mindepth 1
# 4 - Utilise arg_r si activé pour limité la recherche au dossier actuel sans les sous dossiers
# 5 - Utilise arg_f si activé pour limité la recherche aux fichiers
# find "${PWD}" -depth -mindepth -maxdepth -type
find "${PWD}" -depth -mindepth ${arg_a:-1} ${arg_r} ${arg_f} > /tmp/liste_originale.txt
# Iconv test chaque format jusqu'à l'arret par l'utilisateur
for code in "iso-8859-1" "CP437" "iso-8859-2" "iso-8859-3" "iso-8859-4" "iso-8859-5" "iso-8859-6" "iso-8859-7" "iso-8859-8" "iso-8859-9" "iso-8859-10" "iso-8859-11" "iso-8859-13" "iso-8859-14" "iso-8859-15" "iso-8859-16" "cp737" "cp775" "cp850" "cp852" "cp855" "cp856" "cp857" "cp860" "cp861" "cp862" "cp863" "cp864" "cp865" "cp866" "cp869" "cp874" "cp932" "cp936" "cp949" "cp950" "cp1250" "cp1251" "cp1252" "cp1253" "cp1254" "cp1255" "cp1256" "cp1257" "cp1258"
do
# Annonce le format utilisé
echo -e "\n${BLEUFONCE}Test avec pour format original ${FUSHIA}${code}${NOIR}.\n"
# Iconv crée un nouveau fichier avec le nouveau codage
iconv -f ${code} -t UTF-8 /tmp/liste_originale.txt -o /tmp/liste_corrige.txt 2>/tmp/liste_erreur.txt
# Si le fichier d'erreur de iconv n'est pas vide, on saute la boucle en cours
if [[ -s /tmp/liste_erreur.txt ]]
then
# Annonce lque ce ne peut être ce format
echo -e "${ROUGE}Il est certain que ce n'est pas le codage : ${code}.${NOIR}"
# On saute ce format qui n'est pas le bon"
continue
fi
# Compare les 2 fichiers et y supprime les lignes identiques dans les 2 fichiers
cat /tmp/liste_originale.txt | while read ligne
do
fichier="${ligne##*/}"
if [[ -n $(egrep "${fichier}$" /tmp/liste_corrige.txt) ]]
then
sed -i "/${fichier}$/d" /tmp/liste_corrige.txt
sed -i "/${fichier}$/d" /tmp/liste_originale.txt
fi
done
# Suppression du fichier avec les differences couleurs
if [[ -e /tmp/liste_couleur.txt ]]
then
rm /tmp/liste_couleur.txt
fi
# Calcul du nombre de ligne à faire sinon boucle à l'infinie
max_ligne=$(wc -l /tmp/liste_originale.txt)
# On boucle sur les lignes afin de les faire 1 à 1
for (( a=1 ; a <= ${max_ligne%% *} ; a++ ))
do
# récupération de la ligne "a" à utiliser pour liste_originale.txt
ligne_originale=$(sed -n ${a}p /tmp/liste_originale.txt)
# récupération de la ligne "a" à utiliser pour liste_corrige.txt
ligne_corigee=$(sed -n ${a}p /tmp/liste_corrige.txt)
# Boucle sur les carac afin de les traiter 1 à 1 avec pour max le nombre de caractere de la ligne originale
for (( b=0 ; b <= ${#ligne_originale} ; b++ ))
do
# Comparaison des caracteres entre eux
if [[ "${ligne_originale:${b}:1}" == "${ligne_corigee:${b}:1}" ]]
then
# S'ils sont identiques on les envoie 1 à 1 dans le fichier /tmp/liste_couleur.txt
echo -n "${ligne_corigee:${b}:1}" >> /tmp/liste_couleur.txt
else
# S'ils sont différent on les envoie 1 à 1 entouré de balise de couleur dans le fichier /tmp/liste_couleur.txt
echo -n "${BLEUFONCE}${ligne_corigee:${b}:1}${NOIR}" >> /tmp/liste_couleur.txt
fi
done
# On fait un retour entre les lignes sinon tout se suit
echo >> /tmp/liste_couleur.txt
done
# On charge les lignes avec cat mais on utilise
echo -e "$(cat /tmp/liste_couleur.txt)"
# On demande confirmation du résultat par l'utilisateur
echo -e "\n${BLEUFONCE}Ce codage est-il le bon ?${NOIR}"
read -p "[O]ui/[N]on/[E]xit : " codage_ok
# Si l'utilisateur est ok avec le codage, on arrete la boucle
# Si la variable codage_ok commence par "O" ou "o", c'est bon
if [[ ${codage_ok} == [Oo]* ]]
then
# Arret de la boucle, on passe à la suite
break
elif [[ ${codage_ok} == [Ee]* ]]
then
# Suppression des fichiers txt
rm /tmp/liste_originale.txt /tmp/liste_corrige.txt /tmp/liste_erreur.txt /tmp/liste_couleur.txt
# Arret du script
exit 1
fi
done
# Si la boucle s'est terminée sans que l'utilisateur accepte l'encodage
if [[ ${codage_ok} != [Oo]* ]]
then
echo -e "\n${ROUGE}Le script n'a pas réussis à trouver le bon codage original.
Désolé mais le script s'arrete là.${NOIR}\n"
# Suppression des fichiers txt
rm /tmp/liste_originale.txt /tmp/liste_corrige.txt /tmp/liste_erreur.txt /tmp/liste_couleur.txt
# Arret du script
exit 1
fi
# Un petit saut de ligne :)
echo
# Traite les adresses complétes origineles 1 par 1
cat /tmp/liste_originale.txt | while read nom
do
# Récupération de l'adresse du fichier
adresse_origine=${nom%/*}
# Récupération du nom du fichier
nom_origine=${nom##*/}
# Récupération de l'adresse compléte
corrige=$(head -1 /tmp/liste_corrige.txt)
# Récupération du nouveau nom du fichier
nom_corrige=${corrige##*/}
# Si les 2 noms sont différents
if [[ "${nom_origine}" != "${nom_corrige}" ]]
then
# Affiche l'ancienne adresse et la nouvelle
echo -e "${BLEUFONCE}${nom_origine}${NOIR} devient ${FUSHIA}${nom_corrige}${NOIR}."
# Renomme le fichier avec le nouveau nom
mv "${nom}" "${adresse_origine}"/"${nom_corrige}"
fi
# On supprime la ligne venant d'être lue, la 1ere
sed -i "1d" /tmp/liste_corrige.txt
done
# Suppression des fichiers txt
rm /tmp/liste_originale.txt /tmp/liste_corrige.txt /tmp/liste_erreur.txt /tmp/liste_couleur.txt
# Arret du script
exit 0
Screenshot :
Voila comment ça se présente sans option, donc dossiers et fichiers de façon récursif sans le dossier dans le quel on se trouve.
Option -f qui ne montre que les fichiers :
Option -r qui n'est pas récursif :
Options -r et -f, il n'affiche que les fichiers du dossier courant :
Option -a, traite également le dossier courant :
Options -r et -a, traite le dossier courant mais pas les sous-dossiers :
Option -h, une petite aide
Code qui m'a fait réfléchir a 2-3h du mat alors que je suis malade...
# Calcul du nombre de ligne à faire sinon boucle à l'infinie
max_ligne=$(wc -l /tmp/liste_originale.txt)
# On boucle sur les lignes afin de les faire 1 à 1
for (( a=1 ; a <= ${max_ligne%% *} ; a++ ))
do
# récupération de la ligne "a" à utiliser pour liste_originale.txt
ligne_originale=$(sed -n ${a}p /tmp/liste_originale.txt)
# récupération de la ligne "a" à utiliser pour liste_corrige.txt
ligne_corigee=$(sed -n ${a}p /tmp/liste_corrige.txt)
# Boucle sur les carac afin de les traiter 1 à 1 avec pour max le nombre de caractere de la ligne originale
for (( b=0 ; b <= ${#ligne_originale} ; b++ ))
do
# Comparaison des caracteres entre eux
if [[ "${ligne_originale:${b}:1}" == "${ligne_corigee:${b}:1}" ]]
then
# S'ils sont identiques on les envoie 1 à 1 dans le fichier /tmp/liste_couleur.txt
echo -n "${ligne_corigee:${b}:1}" >> /tmp/liste_couleur.txt
else
# S'ils sont différent on les envoie 1 à 1 entouré de balise de couleur dans le fichier /tmp/liste_couleur.txt
echo -n "${BLEUFONCE}${ligne_corigee:${b}:1}${NOIR}" >> /tmp/liste_couleur.txt
fi
done
# On fait un retour entre les lignes sinon tout se suit
echo >> /tmp/liste_couleur.txt
done
# On charge les lignes avec cat mais on utilise
echo -e "$(cat /tmp/liste_couleur.txt)"
je pense que tu devrait pouvoir le réutiliser (pas regarde pour ton script), mais en gros :
- Une boucle qui travaille sur les lignes des listes avec pour maximum le nombre de ligne d'un de ces fichiers (ils ont autant de lignes, car les lignes ne posant pas de problème ont été supprimé avant).
- On récupère les lignes à tester sur chaque liste (même ligne pour les 2)
- On crée une autre boucle qui travaille sur les caractères, 1 à 1
- On compare les caractères l'un par rapport à l'autre, s'ils sont identique, on les envoie comme ça dans un autre fichier, s'ils sont différents on les encadre des fonctions de couleur.
- On lit le nouveau fichier contenant les codes couleurs, je n'ai pas trouvé comment faire avec simplement echo ou cat, j'ai donc fais un mixe des 2.
- Ce fichier n'est utilisé bien évidemment que pour être affiché.
Voilou, si vous avez d'autres idées ou questions
PS : merci de me signaler les fautes
Un bug de vu mais je ne sais pas comment le résoudre en fait : si après modif on repasse le script, il ne sait plus lire les noms qui sont UTF-8...
Dernière modification par Hizoka (Le 12/11/2009, à 03:44)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#42 Le 12/11/2009, à 13:29
- Lapogne71
Re : [Script] pour renommer les fichiers avec problèmes d'accents
hizoka, je pense qu'on se rapproche de la perfection
je vais étudier ton travail, mais un peu de patience , bravo pour la modif sur les couleurs, c'est beaucoup plus agréable comme çà.
On va aussi peut-être éviter de poster toutes nos versions sur le forum afin de ne pas le polluer, mais en pensant bien à mettre à jour le post d'origine, c'est celui que tout le monde lit en premier et qui rassemble l'essentiel.
Hors ligne
#43 Le 12/11/2009, à 16:25
- Hizoka
Re : [Script] pour renommer les fichiers avec problèmes d'accents
oui il faut mettre le 1er a jour mais je pense qu'il est toujours intéressant de poster nos évolution ca permet de voir des trucs pour les gens qui débute dans le bash.
après on peut toujours ajouter la possibilité de lancer le script avec une adresse autre que le dossier dans le quel on se trouve.
et je me disais en fait, qu'il serait surement plus simple pour le script que de base, il récupère également le nom du dossier courant pour le traité et que pour ne pas qu'il le fasse, ajouter l'option -a, surement mieux.
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#44 Le 12/11/2009, à 17:24
- Hizoka
Re : [Script] pour renommer les fichiers avec problèmes d'accents
Hop ! encore des modifs
ligne 10 à 56
# Utiliser les arguments lu par le script
while getopts ":arfhe:" Option
do
case $Option in
# Si c'est l'option -a (all) alors on ne vérifie pas le nom du dossier dans lequel on se trouve
a ) arg_a="-mindepth 1" ;;
# Pour limiter la recherche uniquement au contenu du dossier et non aux sous dossiers
r ) arg_r="-maxdepth 1" ;;
# Si c'est l'option -f alors on ne fait une recherche que sur les fichiers
f ) arg_f="-type f" ;;
# Si une adresse est donnée, on le verifie et on s'y rend
e ) if [[ -e "${OPTARG}" ]]
then
cd "${OPTARG}"
else
echo -e "\n${ROUGE}Adresse invalide, arret du script !${NOIR}\n" && exit 1
fi ;;
# Si c'est l'option -i alors voila quelques infos
h ) echo -e "\n${FUSHIA}De base ce script scan tous les fichiers et dossiers du dossier courant ainsi que le nom de ce dernier.
Options disponibles :
${FUSHIA}-a : ${BLEUFONCE}Permet de ne pas traiter le nom du dossier courant. ${FUSHIA}Inutile avec -f.
${FUSHIA}-r : ${BLEUFONCE}Ne traite pas les sous dossiers, ne traite que les éléments présents dans le dossier courant.
${FUSHIA}-f : ${BLEUFONCE}Permet de ne traiter que les fichiers sans traiter les dossiers. ${FUSHIA}Inutile avec -a.${NOIR}\n" && exit 0 ;;
# SI l'option n'existe pas, arrêt du script
* ) echo -e "\n${ROUGE}Option indisponible, arret du script !${NOIR}\n" && exit 1 ;;
esac
done
shift $(($OPTIND - 1))
echo -e "${BLEUFONCE}Pour plus d'informations, utilisez l'option ${FUSHIA}-h${NOIR}."
sleep 1
# 1 - Recherche dans le dossier actuel
# 2 - Recherche d'abord les sous-fichiers
# 3 - Verifie arg_a, si indisponible alors cela sera : -mindepth 1
# 4 - Utilise arg_r si activé pour limité la recherche au dossier actuel sans les sous dossiers
# 5 - Utilise arg_f si activé pour limité la recherche aux fichiers
# find "${PWD}" -depth -mindepth -maxdepth -type
find "${PWD}" -depth ${arg_a} ${arg_r} ${arg_f} > /tmp/liste_originale.txt
Modification des explications, ajout de la commande -e adresse qui lance le script dans ce dossier s'il existe.
De base il scan tout maintenant mais si on ne veut pas on ajout les limitations (a r f).
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#45 Le 16/11/2009, à 23:50
- Hizoka
Re : [Script] pour renommer les fichiers avec problèmes d'accents
j'ai testé sur 500 fichiers, ça met pas mal de temps à afficher le résultat quand même...
EDIT : j'ai modifié mon code pour qu'il ne compare plus que les noms des fichiers et non les adresses pour les differences de caractere mis en couleur.
#!/bin/bash
###########
#
#
FUSHIA="\033[1;35m"
NOIR="\033[1;0m"
BLEUFONCE="\033[1;34m"
VERT="\033[1;32m"
ROUGE="\033[1;31m"
GRAS="\033[1m"
# Utiliser les arguments lu par le script
while getopts ":arfhe:" Option
do
case $Option in
# Si c'est l'option -a (all) alors on ne vérifie pas le nom du dossier dans lequel on se trouve
a ) arg_a="-mindepth 1" ;;
# Pour limiter la recherche uniquement au contenu du dossier et non aux sous dossiers
r ) arg_r="-maxdepth 1" ;;
# Si c'est l'option -f alors on ne fait une recherche que sur les fichiers
f ) arg_f="-type f" ;;
# Si une adresse est donnée, on le verifie et on s'y rend
e ) if [[ -e "${OPTARG}" ]]
then
cd "${OPTARG}"
else
echo -e "\n${ROUGE}Adresse invalide, arret du script !${NOIR}\n" && exit 1
fi ;;
# Si c'est l'option -i alors voila quelques infos
h ) echo -e "\n${FUSHIA}De base ce script scan tous les fichiers et dossiers du dossier courant ainsi que le nom de ce dernier.
Options disponibles :
${FUSHIA}-a : ${BLEUFONCE}Permet de ne pas traiter le nom du dossier courant. ${FUSHIA}Inutile avec -f.
${FUSHIA}-r : ${BLEUFONCE}Ne traite pas les sous dossiers, ne traite que les éléments présents dans le dossier courant.
${FUSHIA}-f : ${BLEUFONCE}Permet de ne traiter que les fichiers sans traiter les dossiers. ${FUSHIA}Inutile avec -a.${NOIR}\n" && exit 0 ;;
# SI l'option n'existe pas, arrêt du script
* ) echo -e "\n${ROUGE}Option indisponible, arret du script !${NOIR}\n" && exit 1 ;;
esac
done
shift $(($OPTIND - 1))
echo -e "${BLEUFONCE}Pour plus d'informations, utilisez l'option ${FUSHIA}-h${NOIR}."
sleep 1
# 1 - Recherche dans le dossier actuel
# 2 - Recherche d'abord les sous-fichiers
# 3 - Verifie arg_a, si indisponible alors cela sera : -mindepth 1
# 4 - Utilise arg_r si activé pour limité la recherche au dossier actuel sans les sous dossiers
# 5 - Utilise arg_f si activé pour limité la recherche aux fichiers
# find "${PWD}" -depth -mindepth -maxdepth -type
find "${PWD}" -depth ${arg_a} ${arg_r} ${arg_f} > /tmp/liste_originale.txt
# Iconv test chaque format jusqu'à l'arret par l'utilisateur
for code in "iso-8859-1" "CP437" "iso-8859-2" "iso-8859-3" "iso-8859-4" "iso-8859-5" "iso-8859-6" "iso-8859-7" "iso-8859-8" "iso-8859-9" "iso-8859-10" "iso-8859-11" "iso-8859-13" "iso-8859-14" "iso-8859-15" "iso-8859-16" "cp737" "cp775" "cp850" "cp852" "cp855" "cp856" "cp857" "cp860" "cp861" "cp862" "cp863" "cp864" "cp865" "cp866" "cp869" "cp874" "cp932" "cp936" "cp949" "cp950" "cp1250" "cp1251" "cp1252" "cp1253" "cp1254" "cp1255" "cp1256" "cp1257" "cp1258"
do
# Annonce le format utilisé
echo -e "\n${BLEUFONCE}Test avec pour format original ${FUSHIA}${code}${NOIR}.\n"
# Iconv crée un nouveau fichier avec le nouveau codage
iconv -f ${code} -t UTF-8 /tmp/liste_originale.txt -o /tmp/liste_corrige.txt 2>/tmp/liste_erreur.txt
# Si le fichier d'erreur de iconv n'est pas vide, on saute la boucle en cours
if [[ -s /tmp/liste_erreur.txt ]]
then
# Annonce lque ce ne peut être ce format
echo -e "${ROUGE}Il est certain que ce n'est pas le codage : ${code}.${NOIR}"
# On saute ce format qui n'est pas le bon"
continue
fi
# Compare les 2 fichiers et y supprime les lignes identiques dans les 2 fichiers
cat /tmp/liste_originale.txt | while read ligne
do
fichier="${ligne##*/}"
if [[ -n $(egrep "${fichier}$" /tmp/liste_corrige.txt) ]]
then
sed -i "/${fichier}$/d" /tmp/liste_corrige.txt /tmp/liste_originale.txt
fi
done
# Suppression du fichier avec les differences couleurs
if [[ -e /tmp/liste_couleur.txt ]]
then
rm /tmp/liste_couleur.txt
fi
# Calcul du nombre de ligne à faire sinon boucle à l'infinie
max_ligne=$(wc -l /tmp/liste_originale.txt)
# On boucle sur les lignes afin de les faire 1 à 1
for (( a=1 ; a <= ${max_ligne%% *} ; a++ ))
do
# remplacement des espaces par des @, on met des espaces entre chaque caractére pour la ligne du texte original
ligne_originale=$(sed -n ${a}p /tmp/liste_originale.txt)
adresse_originale="${ligne_originale%/*}"
nom_fichier_original="${ligne_originale##*/}"
# remplacement des espaces par des @, on met des espaces entre chaque caractére pour la ligne du texte corrigé
ligne_corigee=$(sed -n ${a}p /tmp/liste_corrige.txt)
nom_fichier_corigee="${ligne_corigee##*/}"
echo -n "${adresse_originale}/" >> /tmp/liste_couleur.txt
# Boucle sur les carac afin de les traiter 1 à 1 avec pour max le nombre de caractere de la ligne originale
for (( b=0 ; b <= ${#ligne_originale} ; b++ ))
do
# Comparaison des caracteres entre eux
if [[ "${nom_fichier_original:${b}:1}" == "${nom_fichier_corigee:${b}:1}" ]]
then
# S'ils sont identiques on les envoie 1 à 1 dans le fichier /tmp/liste_couleur.txt
echo -n "${nom_fichier_corigee:${b}:1}" >> /tmp/liste_couleur.txt
else
# S'ils sont différent on les envoie 1 à 1 entouré de balise de couleur dans le fichier /tmp/liste_couleur.txt
echo -n "${BLEUFONCE}${nom_fichier_corigee:${b}:1}${NOIR}" >> /tmp/liste_couleur.txt
fi
done
# On fait un retour entre les lignes sinon tout se suit
echo >> /tmp/liste_couleur.txt
done
# On charge les lignes avec cat mais on utilise
echo -e "$(cat /tmp/liste_couleur.txt)"
# On demande confirmation du résultat par l'utilisateur
echo -e "\n${BLEUFONCE}Ce codage est-il le bon ?${NOIR}"
read -p "[O]ui/[N]on/[E]xit : " codage_ok
# Si l'utilisateur est ok avec le codage, on arrete la boucle
# Si la variable codage_ok commence par "O" ou "o", c'est bon
if [[ ${codage_ok} == [Oo]* ]]
then
# Arret de la boucle, on passe à la suite
break
elif [[ ${codage_ok} == [Ee]* ]]
then
# Suppression des fichiers txt
rm /tmp/liste_originale.txt /tmp/liste_corrige.txt /tmp/liste_erreur.txt /tmp/liste_couleur.txt
# Arret du script
exit 1
fi
done
# Si la boucle s'est terminée sans que l'utilisateur accepte l'encodage
if [[ ${codage_ok} != [Oo]* ]]
then
echo -e "\n${ROUGE}Le script n'a pas réussis à trouver le bon codage original.
Désolé mais le script s'arrete là.${NOIR}\n"
# Suppression des fichiers txt
rm /tmp/liste_originale.txt /tmp/liste_corrige.txt /tmp/liste_erreur.txt /tmp/liste_couleur.txt
# Arret du script
exit 1
fi
# Un petit saut de ligne :)
echo
# Traite les adresses complétes origineles 1 par 1
cat /tmp/liste_originale.txt | while read nom
do
# Récupération de l'adresse du fichier
adresse_origine=${nom%/*}
# Récupération du nom du fichier
nom_origine=${nom##*/}
# Récupération de l'adresse compléte
corrige=$(head -1 /tmp/liste_corrige.txt)
# Récupération du nouveau nom du fichier
nom_corrige=${corrige##*/}
# Affiche l'ancienne adresse et la nouvelle
echo -e "${BLEUFONCE}${nom_origine}${NOIR} devient ${FUSHIA}${nom_corrige}${NOIR}."
# Renomme le fichier avec le nouveau nom
mv "${nom}" "${adresse_origine}"/"${nom_corrige}"
# On supprime la ligne venant d'être lue, la 1ere
sed -i "1d" /tmp/liste_corrige.txt
done
# Suppression des fichiers txt
rm /tmp/liste_originale.txt /tmp/liste_corrige.txt /tmp/liste_erreur.txt /tmp/liste_couleur.txt
Dernière modification par Hizoka (Le 17/11/2009, à 21:43)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#46 Le 17/11/2009, à 18:46
- Lapogne71
Re : [Script] pour renommer les fichiers avec problèmes d'accents
j'ai testé sur 500 fichiers, ça met pas mal de temps à afficher le résultat quand même...
Pourrais-tu plutôt mettre en ligne le script complet (un peu comme je l'ai fait ) avec éventuellement un fichier zip de tests que tu trouverais plus significatif que le mien...
Sachant que pour moi le but (retrouver les caractères accentués) est quand même largement atteint, avec ton script ou le mien
Hors ligne
#47 Le 17/11/2009, à 21:46
- Hizoka
Re : [Script] pour renommer les fichiers avec problèmes d'accents
le code est juste au dessus.
par contre j'ai quand même un bug...
si on scan des fichiers déjà en UTF8 accentués, il veut nous les transformer en caractères illisibles...
du coup je me dis : je lance un 1er iconv en utf8 pour qu'il supprime directement les lignes identiques mais il me fait un message d'erreur car il y a des caractères (les corrompus) non compatible UTF-8...
du coup ça veut dire qu'il ne faut pas l'utiliser dans un dossier contenant des fautes et des caractères particuliers normaux...
une idée ?
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#48 Le 17/11/2009, à 22:29
- Lapogne71
Re : [Script] pour renommer les fichiers avec problèmes d'accents
du coup ça veut dire qu'il ne faut pas l'utiliser dans un dossier contenant des fautes et des caractères particuliers normaux...
une idée ?
C'est ce que je disais dans le post d'origine :
Inconvénients : - l'outil utilisé 'iconv' ne différencie pas les noms de fichiers "valides avec accents" des noms de fichiers "invalides" ==> il modifiera les noms de fichiers avec accents même si ceux-ci sont corrects ==> attention à bien vérifier que votre dossier soit homogène
Au contraire, convmv fait bien la distinction
"Une idée ? " ==> c'est surement parce que iconv travaille avec un flux de texte (il est au départ fait pour traiter le contenu d'un fichier, et pas son nom), alors que convmv doit travailler (si je ne me trompe pas !) avec le système de fichiers et les noms de fichiers.
Hors ligne
#49 Le 17/11/2009, à 22:59
- Hizoka
Re : [Script] pour renommer les fichiers avec problèmes d'accents
mince ça va être difficile alors...
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#50 Le 20/11/2009, à 03:04
- TOXIC
Re : [Script] pour renommer les fichiers avec problèmes d'accents
Ok, alors j'avoue ne pas avoir eu le courage de tout lire... Mais...
1/ MERCI oh merci ! Ca m'a déjà bien aidé !
2/ J'ai un petit soucis car j'ai utilisé la version du premier post (le premier lien, car j'ai besoin de récursif) et je ne sais pas si c'est la dernière version et la mieux...
3/ J'ai un soucis : ca fait des erreurs :
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = (unset),
LC_ALL = (unset),
Alors comme je ne suis pas un crack de PERL, je ne sait pas quoi faire...
Ensuite, comme c'est un truc super utile, j'aimerais vraiment qu'on essaye de tenir le premier post à jour pour proposer les dernières versions... Ou si quelqu'un peut me pointer vers un endroit pour rester à jour...
D'avance merci, et déjà merci pour tout le bien que ce script m'a fait !!!
Edit :
Il semblerait qu'un "banal" export LC_ALL="fr_FR.UTF8" ait suffit a faire disparaitre le message d'erreur... En espérant maintenant que le script qui ne trouve aucun fichier mal codé ne se trompe pas... Je lance la copie, résultat dans 22h pour savoir si le script aurait oublié des fichiers mal codés....
Dernière modification par TOXIC (Le 20/11/2009, à 03:20)
Hors ligne