#!/bin/sh # Renomme les photos en fonction de la date lue dans les metadatas # 21/10/06 : v0 # 07/09/07 : length date 20 ==> 19 # 01/09/08 : ajout des options --help, --affiche et --comment # 07/02/09 : ajout de l'option --ajoutDate # 15/02/09 : ajout du traitement des dossiers [dossierPhotos] # 03/09/09 : remplacer identify par exiftool plus rapide # Options : datePhotos [--check] [--comment] [--affiche] [--ajoutDate] [dossierPhotos] [nomPhotos] # 'nomPhotos' : ne prend en compte que les photos du nom '*nomPhotos*.jpg' # 1) Obtenir les metadata d'une photo avec ImageMagick : # identify -format %[EXIF:*] photo.jpg # OU identify -format '%[EXIF:*]' photo.jpg # # Juste la date de prise de vue : # identify -format %[EXIF:DateTimeOriginal] photo.jpg # # 2) Obtenir les metadata d'une photo avec exiftool : # exiftool -"DateTimeOriginal" -s -s -s photo.jpg usage() { echo -e "Usage : $(basename $0) [--check] [--comment] [--affiche] [--ajoutDate]\n\t\t [dossierPhotos] [nomPhotos]" echo echo -e " \033[1mRenomme les fichiers en fonction de leur date contenue dans\n\tleurs données EXIF.\033[0m" echo echo -e " \033[34m--check\033[0m : ne fait que tester si les photos sont bien triées" echo -e " \033[34m--comment|-c\033[0m : tient compte d'un commentaire dans le nom du fichier\n\t\tlors du renommage" echo -e " \033[34m--affiche\033[0m : affiche la date des photos" echo -e " \033[34m--ajoutDate\033[0m : ajoute la date de la photo dans son nom sous la forme\n\t\t\"photo 45 (jj-mm-aaaa).jpg\"" echo echo -e " \033[34mdossierPhotos\033[0m : renomme toutes les photos jpg du dossier" echo " Si non donné, dossier courant par défaut" echo -e " \033[34mnomPhotos\033[0m : ne prend en compte que les photos du nom '*nomPhotos*.jpg'" echo " Si non donné, renomme toutes les photos jpg" exit $1 } ################# ### OPTIONS ### ################# while [ -n "$1" ]; do case "$1" in --check) CHECK=1;; --comment|-c) COMMENT=1;; --affiche) AFFICHE=1;; --ajoutDate) AJOUTDATE=1;; --help|-h) usage;; *) if [ -d "$1" ]; then cd "$1" [ -n "$2" ] && nomPhotos="$2" && shift else nomPhotos="$1" fi shift break ;; esac shift done if [ "$CHECK" == "1" ] && [ "$COMMENT" == "1" -o "$AJOUTDATE" == "1" ] ; then echo -e "\n\033[7mL'option --check n'est pas compatible avec --comment|-c et --ajoutDate !\033[0m\n" usage 1 fi if [ -n "$1" ]; then echo -e "\n\033[7mL'option \"$*\" n'est pas attendue ici !\033[0m\n" usage 1 fi ###################### ### LECTURE DATE ### ###################### quit() { rm $fichDate $fichSort $fichDif $fichFich 2&>/dev/null exit 0 } fichDate=/tmp/date$$.tmp #date des photos + nom fichier fichSort=/tmp/dateSort$$.tmp #idem, trié fichDif=/tmp/dateDif$$.tmp #différences entre fichiers fichDate/Sort fichFich=/tmp/dateFich$$.tmp #nom fichier trié par date rm $fichDate 2&>/dev/null #au cas où... motif="[jJ][pP][gG]" toutOK=0 #0 si on trouve une date valide pour toutes les photos, +1 sinon nombre=$(ls |grep "$nomPhotos.*\.$motif$" -c) n=0 if [ $nombre -eq 0 ] ;then echo "Pas de photos." quit fi for file in *"$nomPhotos"*.$motif ; do n=$(($n+1)) echo -en "[$n/$nombre] détection de la date de '$file'... " #date="$(identify -format %[EXIF:DateTimeOriginal] "$file")" date="$(exiftool -"DateTimeOriginal" -s -s -s "$file")" echo -en "\r\033[K" #retour en début de ligne + efface la ligne if [ -z "$date" ] ; then #-z : vide echo "Pas trouvé la date de la photo '$file'" toutOK=$(($toutOK+1)) elif [ $(expr length "$date") -ne 19 ] ; then echo "Format de la date de la photo '$file' non valide" toutOK=$(($toutOK+1)) else echo "$date>>>>$file" >> $fichDate if [ "$AFFICHE" == 1 ] ; then echo "$date : [$n/$nombre] $file" fi fi done if [ $nombre -eq $toutOK ] ; then echo "Plus de photos valides !" quit fi nombre2=$(grep "" $fichDate -c) if [ $(($toutOK+$nombre2)) -ne $nombre ] ; then echo "Erreur interne : nombre=$nombre ; nombre2=$nombre2 ; toutOK=$toutOK." quit fi nombre=$nombre2 if [ $toutOK -gt 0 ] ; then echo echo "Attention, $toutOK/$(($toutOK+$nombre)) photos non prises en compte !" fi ############# ### TRI ### ############# sort $fichDate > $fichSort diff $fichDate $fichSort > $fichDif #diff renvoie 0 si les mêmes fichiers, 1 si qq différences ou 2 sinon if [ $? -eq 0 ] ; then echo "OK, les $nombre photos sont bien triées par date." [ "$CHECK" == 1 ] && quit else echo -n "Les $nombre photos ne sont pas triées par date." [ "$CHECK" == 1 ] && echo && quit echo " Les différences sont :" cat $fichDif echo fi ################### ### RENOMMAGE ### ################### read -p "Voulez-vous renommer les $nombre/$(($nombre+$toutOK)) photos par ordre [o/N] ? " res if [ ! "$res" == "o" ] && [ ! "$res" == 'O' ] ;then quit fi sed "s/.*>>>>//" $fichSort > $fichFich #met dans $fichFich les NOMS des fichiers dans l'ordre line1=$(head -1 $fichFich) #1ère ligne titre=${line1% [0-9]*} #supprime le plus petit suffix read -p "Nom des photos ['$titre' par défaut ] : " res if [ "$res" != "" ] ;then titre=$res fi nombre=$(grep "" $fichFich -c) n=0 n_digit=$(expr length $nombre) for i in 1 2 ; do [ "$AJOUTDATE" == "1" ] && fichALire=$fichSort || fichALire=$fichFich #$file = nom du fichier #$date = date du fichier (jj-mm-aaaa) (utilisé seulement si $AJOUTDATE=1) more $fichALire|while read file ; do n=$(($n+1)) n0=$(printf %.${n_digit}d $n) #$n précédé de 0 if [ "$AJOUTDATE" == "1" ]; then date=$(echo "$file"|sed "s/\([0-9]*\):\([0-9]*\):\([0-9]*\).*/\3-\2-\1/") addDate=" ($date)" file=$(echo "$file"|sed "s/.*>>>>//") fi ext=${file##*.} ext=`echo $ext | tr A-Z a-z` #extension du fichier en minuscules if [ "$COMMENT" == 1 ] ; then #SI NOM FICHIER AVEC COMMENTAIRES : #ajout d'un éventuel commentaire dans le nom de la photo #lorsque le nom est du type 'noël 012 Farnières.jpg' ==> 'Farnières' #OLD : comFile=${file#* [0-9]* } #supprime le préfixe (va pas bien si chiffre avant) #OLD : if [ "$comFile" == "$file" ] ; then #y'a pas de commentaires index=$(expr "$file" : ".* [0-9]* .") if [ $index -eq 0 ] ; then comFile="" else comFile=$(expr substr "$file" $index $(expr length "$file")) comFile=${comFile%.jpg} #supprime le suffixe comFile=" $comFile" fi fi #nom="$titre ${n0}.${ext}" nom="$titre ${n0}$addDate$comFile.${ext}" if [ $i -eq 2 ] ; then echo -en "\r\033[K" echo -en "[$n0/$nombre] $file\t==>\t$nom" mv -i "$file" "$nom.TMPTMP" #pour ne pas perdre des photos en faisant 'mv' vers une photo qui existerait déjà else #i=1 echo -e "[$n0/$nombre] $file\t==>\t$nom" fi done if [ $i -eq 1 ] ;then echo read -p "Vous confirmez [O/n] ? " res if [ "$res" == "n" ] || [ "$res" == 'N' ] ;then quit fi else echo -en "\r\033[K" fi done if [ -n "$(ls *.jpg 2>/dev/null |grep "$titre ")" ] ; then echo "Attention, il reste des photos non modifiées dont le nom contient '$titre'." echo "Les photos déplacées portent l'extension '.jpg.TMPTMP'. Si vous êtes sûr qu'il n'y a pas de risque d'écraser les premières photos, vous pouvez lancer la commande " echo " rename .TMPTMP \"\" *jpg.TMPTMP" quit fi rename .TMPTMP "" *jpg.TMPTMP quit