Ayant aussi un problème d'accent sous mandriva 2009 avec KDE4, j'ai été dépanné grace aux post précédents.
Je vous poste donc ma version du script "amélioré" pour permettre de traiter une arborescence importante.
On s'occupe d'abord des noms de dossiers, puis ça renomme les fichiers.
C'est mon premier gros script, donc je m'en suis servi pour apprendre ce langage.
Au final j'ai renommé 1500 accents encodés en iso et 2500 encodés en utf8 ! :cool:
Merci de lire les deux remarques en début de script avant de vous lancer.
#!/bin/bash
# Script permettant de renommer des fichiers et dossiers en remplacant une liste de caractères
# Sélénium134 | débuté le 11/01/2009 | dernière modif le 24/03/2009
#### DEUX REMARQUES IMPORTANTES ####
# Attention, pour virer les mauvais caractères, ce script doit pouvoir les lires !
# Pas d'autre solutions trouvées à l'heure actuelle.
# Donc il faut paramètrer les "locales" pour lire le format iso
# Dans Mandriva il faut aller dans le centre de controle > Système > Gérer les paramètre locaux de votre système > Avancé > Compatibilité encodage ancien (non UTF8)
# Attention, pour fonctionner correctement, ce script doit être encodé de la même façon que les caractères cibles !
# Il est normalement distribué en UTF8, qui est l'encodage des distributions linux récentes.
# Cependant, le but de ce fichier est de supprimer les caractères accentués dans les anciens encodages.
# Il faut donc le convertir dans l'encodage recherché avec la commande suivante :
# $ iconv -f utf-8 -t iso-8859-1 <accent_utf8.sh >accent_iso8859.sh
# Ne pas oublier après de le rendre exécutable !
# Pour le remettre en UTF8 (ben oui pour virer les accents même ceux qui sont bien encodés) :
# $ iconv -f iso-8859-1 -t utf-8 <accent_iso8859.sh >accent_utf8.sh
# Pour connaitre l'encodage d'un fichier avec caractètre accentué (ou de celui ci avant exécution) :
# $ file -i FICHIER.TXT
#### DECLARATION VARIABLES ####
# Répertoire à parcourir
#REP=/mnt/prod/home/thomas/accent/test/
# Liste des caractères à remplacer
ACC=àâçéèêëîïôöùüÂÀÇÉÈÊËÎÏÔÖÙÜ
# Liste des caractères remplaçants
RMP=aaceeeeiioouuAACEEEEIIOOUU
# Initialisation d'un compteur
COMPT=0
# Initialisation d'une variable
END=1
# Création de la variable TEMP qui prend la valeur d'une commande (` `) permettant de créer un fichier temporaire « unique » dans le répertoire /tmp (mktemp)
TEMP=`mktemp`
#### CREATION FONCTIONS ####
# Création d'une fonction (Confirmation) qui demande une confirmation au clavier
Confirmation () {
echo
echo "Etes vous d'accord pour continuer (o/n) ?"
# Attend la saisie d'un paramètre (read) qui sera enregistré dans une variable (nommée CONF)
read CONF
# Teste si la réponse est différente de o et abandonne l'exécution dans ce cas
if [ "$CONF" != "o" ]
then
echo "Exécution abandonné."
exit 0
fi
}
# Création d'une fonction (Remplacer) dont le paramètre est le type d'élément à traiter : d pour dossier et f pour fichier
Remplacer () {
# Cherche (find) dans le répertoire à parcourir ($REP) tous les fichiers ou dossier (-type $1)
# dont le nom (-name) contient un des caractères à remplacer (*[$ACC]*) et les écrit (>) dans un fichier ($TEMP)
find $REP -type $1 -name "*[$ACC]*" > $TEMP
# Test qui fait que si Temp est vide on zappe la confirmation et on passe un paramètre (END=0) à la fonction plus bas pour arréter de boucler sur les dossiers
if [ -n "$(cat $TEMP)" ]
then
# Renvoi la liste et demande confirmation de l'exécution du remplacement
echo "Liste des éléments à traiter :"
cat $TEMP
# Demande de confirmation (appel de la fonction Confirmation)
Confirmation
# Prend le fichier donné en argument (< $TEMP) et lit (read) toutes les lignes (i) tant qu'il y en a (while)
# Pour chaque ligne fait l'action (do) de renommer (mv) en mode interactif et verbeux (-iv) et renomme (et non déplace) les dossiers (T)
# Le fichier de départ ("$i") est renommé en remplaçant (sed) les caractères contenus dans la liste (ACC) par ceux de la seconde liste (RMP)
while read i ; do
#cp -ivR "$i" "$i"_acc134\/" # sauvegarde des fichiers ??
mv -ivT "$i" "$(echo $i | sed 'y/'$ACC'/'$RMP'/')"
let "COMPT = $COMPT + 1"
done < $TEMP
# Avant du supprimer Temp, faire un fichier de log qui conserve en mémoire les changements effectués et leur date
# Supprime (rm) le fichier temporaire créé (TEMP)
rm $TEMP
else
END=0
fi
}
#### MESSAGES DE DEBUT DU SCRIPT ####
# Message d'explication et rappel des paramètres
echo
echo "Cette commande permet de renommer des fichiers et dossiers en remplacant une liste de caractères."
# Demande de saisir au clavier le répertoire à traiter
echo "Indiquer le chemin absolu du répertoire à traiter :"
read REP
echo "Répertoire traité : $REP et tous ses sous-répertoires."
echo "Caractères à remplacer : $ACC"
echo "Caractères remplacants : $RMP"
echo "Attention, le chemin du répertoire traité ne doit pas contenir un des caractères à remplacer sinon ils vont l'être aussi."
# Demande de confirmation (appel de la fonction Confirmation)
Confirmation
# Plus tard, ajouter la possibilité de modifier manuellement les paramètres (au moins le répertoire)
# Teste si un des caractères du répertoire traité fait partie de la liste à remplacer
#if [ "$REP" == "*["$ACC"]*" ]
#then
# echo "Un des caractères du répertoire traité fait partie de la liste à remplacer."
# echo "Il n'est pas possible de traiter ce cas sans générer d'erreur."
# echo "Exécution abandonné."
# exit 1
#fi
#### EXECUTION DES REMPLACEMENTS ####
# Traitement des dossiers dans un premier temps
# Tant que (while) il reste des dossiers contenant des caractères recherchés (varible END non vide)
while [ "$END" -eq 1 ] ; do
echo
echo "** Traitement des dossiers **"
# Appel de la fonction pour traitement des dossiers (d)
Remplacer d
done
# Une fois les dossiers traités, vient le tour des fichiers (moins de problème dans ce cas seul leur noms change et pas leur dossier parent)
echo
echo "** Traitement des fichiers **"
# Appel de la fonction pour traitement des fichiers (f)
Remplacer f
# Message de fin indiquant le nombre de remplacements
echo "$COMPT remplacement(s) effectué(é)."
# Sortie du script
exit 0