#!/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=_
# 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
# Message de fin indiquant le nombre de remplacements
echo "$COMPT remplacement(s) effectué(é)."
# Sortie du script
exit 0