Très régulièrement, on me demande comment renommer chronologiquement un groupe de photos, et les trier dans de multiples sous-répertoires. Sous GNU-Linux évidemment… 😎 Étant donné que je n’avais jamais publié de solution pour cela (et qu’à chaque fois je repars inutilement de zéro), voici un script Shell/Bash, reposant sur les programmes d’ImageMagick, permettant de réaliser très facilement deux ou trois petites choses :
- Créer des sous répertoires selon l’ordre « année/mois/jour » à partir des informations Exif de date de prise de vue présentes dans chacune des photos
- Copier chacune des photo dans le bon sous-répertoire « jour/ »
- Renommer ces photos à l’aide des informations Exif de date et heure de prise de vue
- Ajouter une valeur incrémentée en fin du nom du fichier si une autre photo porte déjà le même nom
- Tourner la photo dans le bon sens si l’appareil avait été tenu verticalement lors du déclenchement
#! /bin/bash # Au prealable, on s'assure que les programmes necessaires sont deja installes which identify >> /dev/null 2>> /dev/null if test $? -eq 1 then cat << EOF >&2 Les programmes d'ImageMagick ne sont pas installes. Merci d'executer cette commande en tant qu'utilisateur root : urpmi imagemagick EOF exit 1 fi i=0 for fic in *jpg *JPG do if test -f "$fic" then # Increment permettant de ne pas ecraser les noms en doublon (photos prises au meme instante en rafale) i=$((i + 1)) i2=`printf '%04d' $i` # De la forme 2013_06_03_10_41_10 nouveau_nom=`identify -verbose $fic | grep 'exif:DateTime:' | sed -e s/'^.*\([0-9][0-9][0-9][0-9]:[0-9][0-9]:[0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]\).*$'/'\1'/g | sed s/'[: ]'/'_'/g` # De la forme 2013/06/03 repertoire=`echo "${nouveau_nom:0:10}" | tr '_' '/'` mkdir -p $repertoire 2>> /dev/null nouveau_fic="${repertoire}/${nouveau_nom}.jpg" # Si un fichier porte deja le meme nom, on ajoute l'increment test -f $nouveau_fic && nouveau_fic="${repertoire}/${nouveau_nom}_${i2}.jpg" cp $fic $nouveau_fic # Verifier l'orientation de la photo orientation=`identify -verbose $nouveau_fic | grep 'exif:Orientation:' | sed -e s/'^.*\([1368]\).*$'/'\1'/g` if test "$orientation" != "1" then convert $nouveau_fic -auto-orient $nouveau_fic~ && mv $nouveau_fic~ $nouveau_fic fi fi done
Bien évidemment, ce script est perfectible, et il ne répondra pas non plus à tous les besoins, notamment en terme de classement. Mais libre à chacun de se l’approprier et de le modifier.