154 lines
5.5 KiB
Bash
Executable file
154 lines
5.5 KiB
Bash
Executable file
#!/bin/bash
|
|
|
|
# Copyright (C) 13/12/2013 Gregory Trolliet
|
|
# Permission is granted to copy, distribute and/or modify this document
|
|
# under the terms of the GNU Free Documentation License, Version 1.3
|
|
# or any later version published by the Free Software Foundation;
|
|
# with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
|
|
# Texts. A copy of the license is included in the section entitled ``GNU
|
|
# Free Documentation License''.
|
|
#
|
|
# Created: 11/01/2009 Thomas 134
|
|
# Modified:
|
|
# -24/03/2009 Thomas 134
|
|
# -13/12/2013 Gregory Trolliet <r4ghn4r0k@gmail.com>
|
|
#
|
|
# Script permettant de renommer des fichiers et dossiers en remplacant une liste
|
|
# de caractères
|
|
|
|
|
|
#### 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 ####
|
|
|
|
# Liste des caractères à remplacer
|
|
ACC=àâäåçéèêëîïíìôöùüÂÀÄÇÉÈÊËÎÏÔÖÙÜ~#:
|
|
# Liste des caractères remplaçants
|
|
RMP=aaaaceeeeiiiioouuAAACEEEEIIOOUU___
|
|
# 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
|
|
CONF="x"
|
|
while [ `echo $CONF | sed 's/^[oOnNqQ]\?$/ok/'` != "ok" ]
|
|
do
|
|
echo "Etes vous d'accord pour continuer (O/n) ?"
|
|
read CONF
|
|
done
|
|
# Attend la saisie d'un paramètre (read) qui sera enregistré dans une variable
|
|
# (nommée CONF)
|
|
# Teste si la réponse est différente de o et abandonne l'exécution dans ce cas
|
|
case $CONF in
|
|
"o"|"O"|"" )
|
|
;;
|
|
* )
|
|
echo "Exécution abandonné."
|
|
exit 0
|
|
;;
|
|
esac
|
|
}
|
|
|
|
# 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 "
|
|
echo "une liste de caractères."
|
|
# Le répertoire est passé en paramètre
|
|
REP=$1
|
|
# Demande de confirmation (appel de la fonction Confirmation)
|
|
Confirmation
|
|
#### 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
|