Contenu | Rechercher | Menus

Annonce

Si vous rencontrez des soucis à rester connecté sur le forum (ou si vous avez perdu votre mot de passe) déconnectez-vous et reconnectez-vous depuis cette page, en cochant la case "Me connecter automatiquement lors de mes prochaines visites".
Test de l'ISO d'Ubuntu francophone : nous avons besoin de testeurs pour la version francophone d'Ubuntu 14.04. Liens et informations ici.

Attention, une faille de sécurité dans bash a récemment été rapportée, il est recommandé de mettre à jour son système (plus de détails)

#26 Le 04/11/2009, à 22:19

Lapogne71

Re : [Script] pour renommer les fichiers avec problèmes d'accents

Nab!!daN a écrit :

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" smile

Hors ligne

#27 Le 05/11/2009, à 20: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

En ligne

#28 Le 05/11/2009, à 23:11

Lapogne71

Re : [Script] pour renommer les fichiers avec problèmes d'accents

Hizoka a écrit :

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 roll

Hors ligne

#29 Le 06/11/2009, à 09: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 smile

En ligne

#30 Le 06/11/2009, à 12:21

Lapogne71

Re : [Script] pour renommer les fichiers avec problèmes d'accents

Hizoka a écrit :

si j'arrive à le faire fonctionner à peu près comme il faut je veux bien t'aider smile

OK je t'envoie un msg par email

Hors ligne

#31 Le 06/11/2009, à 17: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 smile.

Dernière modification par Hizoka (Le 06/11/2009, à 17:50)

En ligne

#32 Le 09/11/2009, à 18:29

Hizoka

Re : [Script] pour renommer les fichiers avec problèmes d'accents

as tu eu le temps de retester ?

En ligne

#33 Le 09/11/2009, à 23:25

Lapogne71

Re : [Script] pour renommer les fichiers avec problèmes d'accents

Hizoka a écrit :

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 ! smile
car pour le moment je n'aurais pas le temps de le modifier

Hors ligne

#34 Le 10/11/2009, à 17: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 smile

quels sont les codages les plus utilisés ?
utf-8  ISO-8859-15....

Dernière modification par Hizoka (Le 10/11/2009, à 19:29)

En ligne

#35 Le 10/11/2009, à 20: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, à 20:17)

En ligne

#36 Le 11/11/2009, à 01: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, à 10:59)

En ligne

#37 Le 11/11/2009, à 11:59

Hizoka

Re : [Script] pour renommer les fichiers avec problèmes d'accents

Nouvelle version smile

#! /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 :

OPTION -h a écrit :

-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..

SANS OPTION a écrit :

/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

OPTION -f a écrit :

/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

OPTION -r a écrit :

/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

OPTION -r -f ou -rf a écrit :

/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

OPTION -a a écrit :

/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

OPTION -r -a ou -ra a écrit :

/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, à 12:04)

En ligne

#38 Le 12/11/2009, à 00: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 smile

Hors ligne

#39 Le 12/11/2009, à 02: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 smile

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 smile

(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 smile

En ligne

#40 Le 12/11/2009, à 02:44

Hizoka

Re : [Script] pour renommer les fichiers avec problèmes d'accents

Voila une version qui ne montre que les fichier à modifier smile

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 smile

Dernière modification par Hizoka (Le 12/11/2009, à 02:45)

En ligne

#41 Le 12/11/2009, à 04: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 tongue

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.
renommage1.png

Option -f qui ne montre que les fichiers :
renommage2.png

Option -r qui n'est pas récursif :
renommage3.png

Options -r et -f, il n'affiche que les fichiers du dossier courant :
renommage4.png

Option -a, traite également le dossier courant :
renommage6.png

Options -r et -a, traite le dossier courant mais pas les sous-dossiers :
renommage7.png

Option -h, une petite aide
renommage5.png

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 smile

PS : merci de me signaler les fautes tongue

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, à 04:44)

En ligne

#42 Le 12/11/2009, à 14:29

Lapogne71

Re : [Script] pour renommer les fichiers avec problèmes d'accents

hizoka, je pense qu'on se rapproche de la perfection wink

je vais étudier ton travail, mais un peu de patience smile , 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, à 17: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.

En ligne

#44 Le 12/11/2009, à 18:24

Hizoka

Re : [Script] pour renommer les fichiers avec problèmes d'accents

Hop ! encore des modifs tongue

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).

En ligne

#45 Le 17/11/2009, à 00: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, à 22:43)

En ligne

#46 Le 17/11/2009, à 19:46

Lapogne71

Re : [Script] pour renommer les fichiers avec problèmes d'accents

Hizoka a écrit :

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 smile ) 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 smile

Hors ligne

#47 Le 17/11/2009, à 22: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 ?

En ligne

#48 Le 17/11/2009, à 23:29

Lapogne71

Re : [Script] pour renommer les fichiers avec problèmes d'accents

Hizoka a écrit :

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 :

Lapogne71 a écrit :

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 smile

"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, à 23:59

Hizoka

Re : [Script] pour renommer les fichiers avec problèmes d'accents

mince ça va être difficile alors...

En ligne

#50 Le 20/11/2009, à 04: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... wink

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, à 04:20)

Hors ligne

Haut de page ↑