#!/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 #Options : datePhotos [nomPhotos|--check] # 'nomPhotos' : ne prend en compte que les photos du nom 'nomPhotos*.jpg' # --check ==> ne fait que tester si les photos sont bien triées #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 if [ $# -gt 0 ] ; then if [ "$1" == "--check" ] ; then CHECK=1 else nomPhotos="$1" fi fi 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")" 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 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 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." else echo -en "Les $nombre photos ne sont pas triées par date." if [ "$CHECK" == 1 ] ; then echo quit fi echo -e " Les différences sont :\n" cat $fichDif sed "s/.*>>>>//" $fichSort > $fichFich #met dans $fichFich les NOMS des fichiers dans l'ordre echo read -p "Voulez-vous renommer les $nombre/$(($nombre+$toutOK)) photos par ordre [o/N] ? " res if [ ! "$res" == "o" ] && [ ! "$res" == 'O' ] ;then quit fi 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 more $fichFich|while read file ; do n=$(($n+1)) n0=$(printf %.${n_digit}d $n) #$n précédé de 0 ext=${file##*.} ext=`echo $ext | tr A-Z a-z` #extension du fichier en minuscules #VOIR CI-DESSOUS si nom fichier avec commentaire nom="$titre ${n0}.${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 #for 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 fi quit exit #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' #comFile=${file#* [0-9]* } #supprime le préfixe (va pas bien si chiffre avant) #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 nom="$titre ${n0}$comFile.${ext}"