Kdo : script de renommage récursif

Top Page

Reply to this message
Author: Johann SUHM
Date:  
To: guilde
Subject: Kdo : script de renommage récursif
Salut a tous !

n'ayant pas trouvé de solution adaptée à mon besoin sur internet, je me
suis lancé dans un script qui renommerait tous les fichiers d'une
arborescence (mon dossier de photos) en remplaçant tous les caractères
bizarres ou accentués.

ça avait l'air facile au départ mais je me suis heurté à pleins
d'obstacles (renommer des dossiers récursif, UTF-8 accepte tous les
caractères, éviter l'interprétation de certains caractères par le shell,
caractère espace, ...).

bref, un bon exercice dont voici le résultat.
merci d'avance pour vos commentaires / corrections / améliorations ... :-)


#!/bin/bash
#-------------------------------
# Auteur : Johann
# renomme les fichiers contenant des caractères indésirables
# nom de fichier pour test (en UTF8, ajouter des espaces) :
# àâçéèêëîïôöùü²&'()=^$,;:!<>¬¹~{[^@]}¨£%µ?§ÂÀÇÉÈÊËÎÏÔÖÙÜ
#-------------------------------

#-------------------------------
# VARIABLES
#-------------------------------

CHEMIN=$1
FIC_LOG="$(basename ${0} .bsh)_$(date +%y%m%d-%H%M%S)"

INDESIR1="àâçéèêëîïôöùüÂÀÇÉÈÊËÎÏÔÖÙÜ"
CORRIGE1="aaceeeeiioouuAACEEEEIIOOUU"

INDESIR2=" ²&'=^$,;:!<>¬¹~{[^@]}¨£%µ?§"
CORRIGE2="____________________________"

# caractères non traités (car ils risquent de provoquer un comportement
erratique) :
INDESIR3="\"\*\\\#\|\`"
CORRIGE3=""

# pour ne pas utiliser les espaces comme separateurs :
IFS='
'

#-------------------------------
# FONCTIONS
#-------------------------------
# si le nom corrigé existe déjà, préfixe avec un numéro
f_test_existe() {
NUM=0
while test -${1} ${DIR}/${RENOMME} # passer "d" ou "f" en paramètres
do
    NUM=$(expr ${NUM} + 1)
    RENOMME=${NUM}_${RENOMME}
done
}


# liste les fichier/dossier contenant des caractères indésirables
f_renomme() {
for VAR in $(find ${CHEMIN} -type ${1} | sort -r) # passer "d" ou "f" en 
paramètres
do
    DIR=$(dirname ${VAR})
    BASE=$(basename ${VAR})
    RENOMME=$(basename ${VAR} | sed 
"y/${INDESIR1}${INDESIR2}/${CORRIGE1}${CORRIGE2}/")
    if [[ ${BASE} != ${RENOMME} ]]
    then
        f_test_existe ${1}
        echo "mv \"${DIR}/${BASE}\" \"${DIR}/${RENOMME}\"" >> 
${FIC_LOG}.renomme
        echo "mv \"${DIR}/${RENOMME}\" \"${DIR}/${BASE}\"" >> 
${FIC_LOG}.annule2
    fi
done
}



#-------------------------------
# PROGRAMME
#-------------------------------

echo "
Ceci va creer un script pour renommer les fichiers et dossier contenus
dans :
${CHEMIN}
Continuer ? (o/n)"

read REP
if [[ ${REP} != "o" ]]
then
exit
fi

f_renomme f
f_renomme d

more ${FIC_LOG}.renomme

# il faut inverser la liste pour le retour arrière
sort -r ${FIC_LOG}.annule2 > ${FIC_LOG}.annule
rm -f ${FIC_LOG}.annule2

echo "
TERMINE.
Pour renommer, taper la commande :
sh ${FIC_LOG}.renomme | tee -a ${FIC_LOG}.log
Pour annuler, taper la commande :
sh ${FIC_LOG}.annule | tee -a ${FIC_LOG}.log
"
exit