Script de renommage de photos selon les données EXIF
Par Taltan le mardi, juillet 17 2007, 09:14 - Ubuntu - Lien permanent
Avec les photos numériques on ne compte pas, on prend des dizaines (voir des centaines) de photos puis on les importe sur le PC pour les trier. Personnellement j'utilise gThumb car il est léger, simple à utiliser, n'est pas usine à gaz, dispose de fonctionnalités assez avancées et en plus est intégré nativement dans Ubuntu. Le premier de ces tris est le renommage, j'ai l'habitude de renommer mes photos en fonction de la date de prise de vue (+ une numérotation) ce qui permet par la suite d'effectuer un tri chronologique dans l'explorateur de fichiers et d'avoir un nom unique.
il est possible de renommer massivement des photos en fonction des données EXIF avec gThumb mais le meilleur résultat que j'ai pu en tirer est un nom de fichier sous la forme 2006-11-04--19.41.56_007.jpg. C'est presque le résultat attendu sauf que je n'ai pas trouvé le moyen d'enlever le double tiret et les secondes qui sont superflus. Voila le pourquoi de ce script, utilisé via les scripts nautilus, en deux clics il permet de renommer une série de photos sous la forme 2006-11-04_19.41_007.jpg
Dépendances :
- Nécessite le paquet imagemagick
- Nécessite le paquet zenity
$ sudo apt-get install imagemagick zenity
Script exif_photos_rename_v1.1.sh :
- 27/07/07 - v1.1
- 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 - #
############################################################################################
# Script exif_photos_rename_v1.1.sh #
# Licence : GNU / GPL #
############################################################################################
# Renomme les photos selon les données EXIF sous la forme : #
# ${aa}-${mm}-${jj}_${hh}.${min}_${numero}.ext => ex : 2006-11-04_19.41_007.jpg #
# Fonctionne pour une numérotation de 001 à 999 #
############################################################################################
# Dépendances #
############################################################################################
# - Nécessite le paquet imagemagick : http://doc.ubuntu-fr.org/imagemagick #
# - Nécessite le paquet zenity #
# => sudo apt-get install imagemagick 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 #
############################################################################################
## Variables
nb_param="$#" # nb de paramètres passés au script
erreur=0 # initialisation du compteur d'erreurs à 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 # si fermeture
exit 1
fi
[ $? -ne 0 ] && exit 2 # si annulation
}
## Fonctions renommage des fichiers
rename_jpeg ()
{
for parametre in "$@"; # pour chaque fichier selectionné
do # faire
old_name="$parametre" # on définie le nom du fichier actuel
date_time=`identify -format "%[EXIF:DateTime]" "$parametre"` # création de la variable date / heure de la photo (ex: 2006:11:04 19:41:30. )
extension=`echo $parametre | awk -F "." '{print $NF}'` # création de la variable extension du fichier (ex : .jpg)
aa=`echo $date_time | cut -d: -f1` # création de la variable année (ex : 2006)
mm=`echo $date_time | cut -d: -f2` # création de la variable mois (ex : 11)
jj=`echo $date_time | cut -d: -f3 | cut -c1-2` # création de la variable jour (ex : 04)
hh=`echo $date_time | cut -d: -f3 | cut -c4-5` # création de la variable heure (ex : 19)
min=`echo $date_time | cut -d: -f4` # création de la variable minute (ex: 41)
# création de la variable numérotation
if [ $numParam -gt 0 ] && [ $numParam -lt 10 ]; then # pour les paramètres 1 à 9
numero=00$numParam # rajouter 2 digit => 001, 002, 003,..., 009
fi
if [ $numParam -gt 9 ] && [ $numParam -lt 100 ]; then # pour les paramètres 10 à 99
numero=0$numParam # rajouter 1 digit => 010, 011, 012,..., 099
fi
if [ $numParam -gt 100 ] ; then # pour les paramètres supérieur à 100
numero=$numParam # ne pas rajouter de digit => 100, 101, 102,...
fi
new_nane=`echo ${aa}-${mm}-${jj}_${hh}.${min}_${numero}.${extension}` # on définie le nouveau nom => 2006-11-04_19.41_num.jpg
cp "$old_name" "${new_nane}" # on renomme le fichier en le copiant
if [ $? = 0 ] ; then # si la copie a reussi
echo "${old_name} => ${new_nane} .... OK"
rm -f "$old_name" # => supprime le fichier original
else # si la copie a echoué
echo "Impossible de renommer $old_name .... NOK" # => message d'erreur
let $[erreur += 1] # incrémentation du compteur d'erreur
fi
let $[numParam += 1] # incrémentation du numéro de paramètre
done
nb_renomme=$(( $nb_param - $erreur )) # création de la variable nombre de fichiers renommés
echo "-----------------------------------------"
echo "Fin de traitement : $# fichiers "
echo "-----------------------------------------"
echo "Fichiers renommes : $nb_renomme"
echo "Fichiers en erreur : $erreur"
echo "-----------------------------------------"
echo "OK, vous pouvez fermer !"
}
## Traitement
if [ "$#" -eq 0 ]; then # si aucun fichier n'est selectionné => mesage d'erreur
zenity --error --title="error" --text="Selectioner au moins 1 fichier"
exit 1
fi
début_numerot
rename_jpeg "$@" | zenity --text-info --title "exif_photos_rename" --width=500 --height=500
Mise en place :
Placer le script exif_photos_rename_v1.1.sh dans le dossier ~/.gnome2/nautilus-scripts, puis le rendre exécutable
$ sudo chmod +x ~/.gnome2/nautilus-scripts/exif_photos_rename_v1.1.sh
Utilisation :
Sélectionner les photos à traiter, puis clic droit / Scripts / exif_photos_rename.sh

Cliquer sur Valider ou modifier le début de numérotation le cas échéant :

Résultat :

NB : _/!\_ 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 











Commentaires
Oh les jolis chats!
Bon post
Justement, je me suis renseigné tout le week end pour pouvoir mettre un ordre dans des photos venant d'appareils différents.
Personnellement, après avoir utilisé gthumbs, je suis passé à jhead (sudo apt-get install jhead & man jhead).
Jhead me permet en plus de changer les données exif des photos avant de les renommer. Changer les données EXIF me permet de synchroniser les appareils (Un appareil qui était à l'heure du mexique, l'autre à l'heure d'hiver, et encore un avec un jour de retard).
Tu as jhead comme super programme afin de renommer les photos d'après leurs données exif. Un jhead -n%Y-%m-%d-%H%M *.jpg va te faire une image du style 2007-07-17-1100.jpg
Du coup ton script peut être encore plus simple
++
Merci beaucoup pour ce post. Je cherchais justement une astuce pour pouvoir classer mes photos pendant mes vacances.
Personnellement j'utilise jbrout qui renomme également les photos selon la date et permet de modifier les données EXIF. Mais il s'agit là d'une interface évoluée qui n'a pas le même objectif.
http://fr.wikipedia.org/wiki/Jbrout
@jm : jbrout utilise jhead
et c'est vraiment un excellent outil que j'ai eu utilisé, mais depuis que je shoot en raw j'ai du en changer.
Deux petites remarques : un mode d'emploi en français très détaillé de zenity est disponible dans l'aide gnome ; ensuite, je ferais bien mumuse avec le code de ton script ; il est sous quelle licence ?
Tartan je vois que tu as un script phpwebgallery... Je serais intéressé
Si tu pouvais faire un autre tuto si ce n'est déjà fait !
Merci pour ce mode d'emploi renommage très limpide.
J'ai trouvé http://www.taltan.fr/?q=phpwebgalle...
Ton site est une mine...
@ Kagou et Peps, merci pour les tuyaux, je connais pas jhead, je vais donc tester ça très vite
@ Czernai, oups, je n'ai pas mis la licence dans le script, (post modifié) c'est du GNU / GPL
@ Adrimaxi, merci pour ces compliments, concernant mon script PhpWebGallery_create.sh, il commence à dater, je suis en train de le maj (depuis que je tate du zenity)
@ Adrimaxi
script Script PhpWebGallery_create_v2.0.sh mis à jour :
http://www.taltan.fr/post/2006/09/0...
+1000 pour jhead. Et pour une intégration dans nautilus sans se prendre la tête, je le couple avec nautilus action :
chemin : jhead
parametres : -n%%Y-%%m-%%d_%%Hh%%M_%%S %M
mime/type : image/jpeg
Effectivement jhead est très efficace, mais il a un inconvénient, il ne traite que les fichiers jpg.
Pour ce qui est de nautilus action, très pratique, je m'en sert aussi, mais je lui préfère les nautilus sript pour certaines actions, que je trouve un peu plus geek peut-être , les goûts et les couleurs ...
Pour renommer en masse des fichiers(enlever le double-tiret par exemple), je te conseille aussi mmv: http://debaday.debian.net/2007/06/1...
c'est vraiment super pratique et très simple
dans ton cas, la commande serait:
mmv "*--*.*.*_*.jpg" "#1_#2.#3_#4.jpg"
facile, non ?
Bonjour,
Une version un peu différente pour servicemenus dans konqueror => http://www.kde-apps.org/content/sho...
Merci pour ton script.
Effectivement, jBrout peut renomer les photos : http://jbrout.free.fr/help/fr/lance...
Il ne gère que les photos jpeg, mais fait beaucoup mieux. Je vous encourage à jeter un coup d'oeil sur l'aide en ligne : http://jbrout.free.fr/help/fr
Sa mèthode de tagguage directement dans les données IPTC de la photo est une merveille d'ergonomie et son module d'export est un des plus complet.
Hummm, super mais t'avais tout de déjà fait et en plus simple ici : http://www.grumz.net/?q=node/274 :p
Pour adapter à tes besoins juste à changé la configuration dans nautilus-action ^^.
Whaou
Avec jhead, mmv, exiv2, etc ... j'ai découvert plein de truc, c'est ça que j'aime dans le libre, la réactivité de la communauté et le fait qu'on peut fourrer notre nez partout !
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 tous ces utilitaires...
Bonjour Taltan,
En tant qu'utilisateur de PhpWebGallery (et même un peu davantage...) j'avais écrit en Perl un script de renommage des photos notamment selon les métadonnées EXIF pour la date [1]. On dirait que c'est un besoin très classique !
[1] http://le-gall.net/pierrick/blog/in...
Moi j'en avais écrit un en Python avec PyGtk et PIL ici : http://www.trunat.fr/portfolio/pyth...
C'est effectivement un besoin très très classique.
Moi j'ai un appareil photo qui sauvegarde les photos avec l'heure et la date, ça simplifie les choses :D
taltan, j'ai utilisé pas mal ton script cet automne (retour de vacances,...) il est terrible, par contre là, je voulais l'utiliser de nouveau, entre temps je suis passé sous hardy heron, je doute que ça sois l'origine de mon pb, mais bon... Car maintenant, impossible de renommer la moindre image : "Impossible de renommer monImg.jpg...NOK". Je suis même allez jusqu'a mettre mon réperoire en 777 et mes images en 666... une idée de par ou je dois chercher ? d'avance, merci et bravo pour tes scripts qui facilite la vie !!!
Ola
J'ai également rencontré ce problème, le souci est qu'à priori imagemagick de Hardy est bugé, d'origine la commande :
$ identify -format "%[EXIF:DateTime]" non_photo.jpeg
ne retourne aucun résultat donc le script ne peut pas fonctionner, j'ai du supprimer la version par défaut de imagemagick pour recompiler une version plus récentes à partir des sources :
http://www.imagemagick.org/script/i...
puis après la compilation, j'ai rajouté à la fin de mon fichier ~/.bashrc la ligne
export LD_LIBRARY_PATH=/usr/local/lib
dis donc tu es super rapide, merci !
entre temps, je m'en suis rendu compte et si tu veux bien, j'ai une autre solution, pour ceux que la compilation rebute (même si dans le fond la c'est pas le mort non plus)...
j'ai utilisé exiftool : sudo apt-get install libimage-exiftool-perl
puis j'ai remplacé les lignes pour obtenir la date par :
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`
encore merci pour tes scripts et ta rapidité à répondre _o/
Merci pour le truc
Je ne connaissais pas cet utilitaire, ça marche effectivement très bien
Bonjour et merci pour cet outil pratique
J'ai apporté des modif basé sur exiftool qui permettront :
- d'éviter le rerenommage d'une photo déjà moulinée
- de classer les photos renommées dans les répertoires aaaa/aaaa-mm
c'est nikel
Par contre, comment partager avec vous ce scipt ? Je n'ai pas de serveur
Bonjour,
J'utilisais également ton script pour renommer mes photos sous feisty, je suis passé sous Hardy et j'ai le même problème, le script ne fonctionne plus. Pitch a une solution qui m'arrangerai bien, mais je suis un peu nul, ça méthode n'est pas assez simple pour moi.J'ai compris qu'il faut installer libimage-exiftool-perl, après il faut modifier le script, et c'est là que je coince, qu'elle ligne il faut remplacer exactement? Je suis bien intéressée par le script de Batchajan, il pourrait le déposer ici : http://dl-c.free.fr/ et mettre le lien pour le télécharger.
Merci taltan pour ton blog je suis fan.
@batchajan
Tu peux me transférer par mail ton script, je mettrai à jour mon billet en mettant en ligne ton script...
ola.taltan_at_laposte.net ou http://www.taltan.fr/contact
@Kalaene
Merci pour le compliment
c'est fait sur ton mail ola.taltan_at_laposte.net
bonne journee
Voila c'est online...
http://www.taltan.fr/post/2008/07/1...