Mise à jour script exif_photos_rename_1.2, renommer les photos selon les données EXIF

Par Taltan

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.

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