Renommer/trier ses photos à la volée

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.