Mise à jour script exif_photos_rename_1.2, renommer les photos selon les données EXIF
Par Taltan le jeudi, juillet 10 2008, 12:15 - Geekerie cultu-libriste - Lien permanent
En cette période de congés estivales, j'ai pu me replonger dans ce script que je voulais mettre à jour depuis un petit moment. Il permet de renommer massivement (via les nautilus-scripts) une série de photos selon les données EXIF sous la forme 20061104_19.41_007.jpg, les 3 derniers digits (ici *007*) étant un compteur qui s'incrémente.
La première modification concerne l'utilisation de l'utilitaire exiftool en lieu et place de imagemagick qui posait souci avec Ubuntu 8.04 LTS Hardy Heron. En effet avec la version native Hardy de imagemagick certaines commandes ne fonctionnaient plus, notamment la commande identify -format "%[EXIF:DateTime] qui retournait une ligne vide (voir le nota bene 3 à la fin de ce post). En outre je trouve que le traitement du script est plus rapide avec exiftool...
La deuxième modification concerne l'affichage d'une boite de dialogue qui permet de suivre l'état d'avancement du traitement en pourcentage, bien plus clean que le déroulement du script dans la fenêtre zenity...
Dépendances :
$ sudo apt-get install libimage-exiftool-perl zenity
Script exif_photos_rename_v1.2.sh :
- 09/07/08 - v1.2
- Remplacement de imagemagick par exiftool pour le traitement
- Ajout boîte de dialogue de barre de progression en pourcentage
- 27/07/07 - v1.1
- Script de renommage de photos selon les données EXIF
- Réorganisation
- Choix du début de numérotation, par défaut à 1
- 15/07/07 - v1.0
- Création
#!/bin/bash
############################################################################################
# Taltan - http://www.taltan.fr - ola.taltan_AT_laposte.net #
############################################################################################
# Script exif_photos_rename_v1.2.sh #
# Licence : GNU / GPL #
############################################################################################
# Renomme les photos selon les données EXIF sous la forme : #
# ${aa}-${mm}-${jj}_${hh}.${min}_${numero}.ext => ex : 20061104_19.41_007.jpg #
# Fonctionne pour une numérotation de 001 à 999 #
############################################################################################
# Dépendances #
############################################################################################
# - Nécessite le paquet exiftool : http://www.sno.phy.queensu.ca/~phil/exiftool/ #
# - Nécessite le paquet zenity : http://library.gnome.org/users/zenity/index.html.fr #
# => sudo apt-get install libimage-exiftool-perl zenity #
############################################################################################
# 15/07/07 - v1.0 - Création #
# 27/07/07 - v1.1 - Réorganisation #
# - Choix du début de numérotation, par défaut à 1 #
# 09/07/08 - v1.2 - Remplacement de imagemagick par exiftool pour le traitement #
# - Ajout boîte de dialogue de barre de progression en pourcentage #
############################################################################################
## Variables
nb_param="$#"
erreur=0
typeset -i CNT=1
typeset -i CUR=0
## Fonctions début de numérotation
début_numerot ()
{
numParam=`zenity --title "Début de numérotation" --entry-text="1" --entry --text "Par défaut à 1, à modifier le cas échéant :"`
if [ $? != 0 ]; then
exit 1
fi
[ $? -ne 0 ] && exit 2 # Annulation
}
## Fonctions renommage des fichiers
rename_jpeg ()
{
for parametre in "$@";
do
old_name="$parametre"
date_time=`exiftool "$parametre" | grep "Create Date"`
extension=`echo $parametre | awk -F "." '{print $NF}'`
aa=`echo $date_time | cut -d: -f2 | cut -c2-5`
mm=`echo $date_time | cut -d: -f3`
jj=`echo $date_time | cut -d: -f4 | cut -c1-2`
hh=`echo $date_time | cut -d: -f4 | cut -c4-5`
min=`echo $date_time | cut -d: -f5`
if [ $numParam -gt 0 ] && [ $numParam -lt 10 ]; then
numero=00$numParam
fi
if [ $numParam -gt 9 ] && [ $numParam -lt 100 ]; then
numero=0$numParam
fi
if [ $numParam -gt 100 ] ; then
numero=$numParam
fi
new_nane=`echo ${aa}${mm}${jj}_${hh}.${min}_${numero}.${extension}`
cp "$old_name" "${new_nane}"
if [ $? = 0 ] ; then
echo "${old_name} => ${new_nane} .... OK" >> /tmp/exif_photos_rename.log
rm -f "$old_name"
else
echo "Impossible de renommer $old_name .... NOK" >> /tmp/exif_photos_rename.log
let $[erreur += 1]
fi
CUR=$CNT*100/$nb_param
echo $CUR
echo "#Traitement de $nb_param photos\n${old_name} => ${new_nane} ... en cours\n\nAvancement: $CUR %\n "
CNT=$CNT+1
let $[numParam += 1]
done
nb_renomme=$(( $nb_param - $erreur ))
if [ $erreur != 0 ] ; then
touch /tmp/exif_photos_rename.err
echo "#Fin de traitement : $nb_param fichiers\n\nFichiers renommés : $nb_renomme\nFichiers impossible à renommer : $erreur\n\n _!!_ Cliquer sur Valider pour afficher le rapport de traitement _!!_\n"
else
echo "#Fin de traitement : $nb_param fichiers\n\nFichiers renommés : $nb_renomme\nFichiers impossible à renommer : $erreur\n\nOK, vous pouvez fermer en cliquant sur Valider !\n"
fi
}
## Fonctions affichage du rapport de traitement
affich_log ()
{
if [ -f /tmp/exif_photos_rename.err ] ; then
cat /tmp/exif_photos_rename.log | zenity --text-info --title "/tmp/exif_photos_rename.log" --width=500 --height=500
fi
rm -f /tmp/exif_photos_rename.log
rm -f /tmp/exif_photos_rename.err
}
## Traitement
if [ "$#" -eq 0 ]; then
zenity --error --title="error" --text="Selectioner au moins 1 fichier"
exit 1
fi
début_numerot
rename_jpeg "$@" | zenity --progress --title="exif_photos_rename" --percentage=0
affich_log
Mise en place :
Placer le script exif_photos_rename_v1.2.sh dans le dossier ~/.gnome2/nautilus-scripts, puis le rendre exécutable
$ sudo chmod +x ~/.gnome2/nautilus-scripts/exif_photos_rename_v1.2.sh
Utilisation :
Sélectionner les photos à traiter, puis clic droit / Scripts / exif_photos_rename_v1.2.sh
Cliquer sur Valider ou modifier le début de numérotation le cas échéant :

Le traitement s'effectue, l'état d'avancement en pourcentage s'affiche :
A la fin du traitement :
1. Si aucune erreur n'est détectée, une petite récap s'affiche
2. Si des fichiers n'ont pu être renommés :
Résultat :
NB 1 : _/!\_ Par principe de précaution, je vous conseille de commencer à utiliser un script qui, au final supprime ou modifie un fichier, sur une copie de vos photos, histoire de voir que tout se passe bien 
NB 2 : Suite à un commentaire de Batchajan sur mon post sur exif_photos_rename_v1.1, j'ai également attaché à ce billet une variante de mon script, exiftool_v1.0.sh. Batchajan l'a en effet modifié pour rajouter les fonctions suivantes :
- Eviter le rerenommage d'une photo déjà moulinée
- Classer les photos renommées dans les répertoires aaaa/aaaa-mm
Merci à Batchajan pour ces modifications, elles pourront être utiles... 
NB 3 : Utilisant imagemagick dans d'autres scripts sur mon Ubuntu 8.04 Hardy Heron, notamment PhpWebGallery_create, j'ai du compiler la dernière version stable de imagemagick à partir des sources :
sudo apt-get install libfontconfig1-dev libjpeg62-dev libpng12-dev librsvg2-dev libtiff4-dev libjasper-dev libwmf-dev "télécharger la dernière version de ImageMagick-6.4.xx" => ftp://ftp.fu-berlin.de/unix/X11/graphics/ImageMagick/ tar -xvzf ImageMagick-6.4.xx cd ImageMagick-6.4.xx ./configure make sudo make install
Puis après la compilation, j'ai rajouté à la fin de mon fichier ~/.bashrc la ligne
export LD_LIBRARY_PATH=/usr/local/lib

















Commentaires
aptitude install jhead
non ?
Moi je fais ça : jhead -autorot -n%Y%m%d_%H%M%S img*jpg
Le "autorot", c'est pour les applications (et browser) à la con qui ne tiennent pas compte du flag d'orientation
Sinon, ce n'est plus nécessaire de tourner les images, en tout cas sous tous les viewers linux.
Effectivement, jhead fait également très bien le renommage. Mon problème à la base c'était les données EXIF + la numérotation 001, 002, ... C'est pour ça que j'ai fait ce petit script maison, cependant la partie extraction des données EXIF peut effectivement se réaliser avec jhead, mais aussi avec mmv, exiv2, imagemagick,...
Pour ce qui est de l'autorot, je suis d'accord avec toi, mais je ne m'en sers pas dans ce script...
$exiv2 -t mv *
cela me parait assez simple également
Au passage, le timestamp est également mis à jour...
Au moins aurons-nous listé tous les outils et donné des exemples de code.
Et surtout (me concernant), un exemple de "comment faire un script nautilus". Je vais adapter mon jhead -blabla...

Merci
C'est très intéressant.
C'est une bonne idée aussi d'afficher un rapport de log.
bravo.
Juste un mot : merci!
Bonjour,
ce script fonctionnait très bien il y a 1 mois et maintenant il ne prend plus en compte la sélection des fichiers. qu'on sélectionne un ou plusieurs fichiers, le message est "Selectioner au moins 1 fichier"
il me semble avoir vu des MAJ nautilus entre temps. est ce la cause ? comment corriger le pb. (j'ai bien essayé mais sans succès)
bonjour,
votre script m'aide beaucoup, une simple suggestion,
il est préferable d'utiliser mv plutot que cp, cp renomme et change le timestamp et mv renomme simplement.
cela permet la date de creation du fichier ( si on fait une betise en renommant )
cp "$old_name" "${new_nane}"
---> mv "$old_name" "${new_nane}"
cordialement
alex
20061104_194112.jpg n'aurait-il pas été plus simple ?
(c-a-d AnMoisJour_HeureMinuteSecondes)
En effet :
1°) Je ne trouve pas cohérent d'afficher un point entre les heures/minutes alors que rien en sépare les An/Mois/Jour
2°) Et les secondes permettent un 1er tri, non ?
bonjour,
merci
sous thunar configurer les actions personaliser et entrer les infos penser a mettre %N pour qu'il prenne toutes les photos en compte , pour info il est deja possible de renommer avec la date de la photos mais il garde le nom donc c'est un peu ch....
sous PCman ouvrir avec un autre et entre la ligne de commande
si ça peut aider .
a+