Table des matières

Modifier les dates des photos (metadata) et des fichiers

Les deux cas d'utilisation les plus courants sont :

Dans le premier cas, les métadonnées horaires enregistrées à l'intérieur des fichiers des photos sont erronées. Il en résulte un décalage horaire dans les métadonnées qu'il va suffire de corriger. Mais la date des fichiers sera également erronée puisque l'horloge de l'appareil photo n'était pas à l'heure.

Dans le second cas, les fichiers se retrouveront avec la date de l'importation des photos. Autrement dit, une date sans lien avec la prise de vue. Dans ce cas, il suffit de récupérer les métadonnées horaires contenue dans chaque photo pour les appliquer aux fichiers correspondants.

On peut aussi souhaiter dater les photos suivant la date du fichier qui les contient. Ce sera notamment le cas pour reconstruire un ordre (“chronologique”) à partir du résultat d'un traitement : par exemple, aligner la chronologie sur l'ordre alphabétique des noms de fichiers1).

Créer des entêtes minimales exif

Si elle n'en possède pas, une manière rapide de doter une photo d'entêtes minimales exif est fournit par la command jhead :

jhead -mkexif -dsft <motif de fichier(s)>

La date et l'heure de la photo seront initialisées à celles du fichier.

Donner une date explicite à une photo

jhead -tsYYYY:MM:DD-HH:MM:SS <motif de fichier(s)>

Corriger la date des photos et synchroniser les dates de fichiers d'un répertoire

Typiquement, la date système de l'appareil photo n'était pas bonne lors de la prise de vue. Les photos (metadonnées) et les fichiers se retrouvent avec une date erronée. En utilisant find2):

find *.JPG -exec sh -c "jhead -ta-1:3:0 -ft {}" \;

Ici, on a retiré 1h et 3 minutes à toutes les photos ayant pour extension ”.JPG“ et appliqué la date résultante au fichiers ainsi modifiés.

Avec un sélecteur plus complexe justifiant l'utilisation de find3) :

find . -type f  -regextype sed -regex "^\.\/IMG_60[[:digit:]][[:digit:]]\.JPG" -exec sh -c "jhead -ta-1:3:0 -ft {}" \;

Dans cette syntaxe, la recherche est récursive sur le répertoire ”.“.

En utilisant une boucle do4) :

for i in *.JPG; do jhead -ta-1:3:0 $i; jhead -ft $i; done

Appliquer la date Exif d'une photo à son fichier

Typiquement, les méta-données sont correctes mais des copies maladroites de fichiers de photos ont modifié la date du fichier alors que la photo et son fichier avaient originellement la même date.

En utilisant la commande jhead 5) :

$ jhead -dsft mon-fichier-jpeg

On peut aussi utiliser la commande exiv26) :

$ exiv2 -T rename *.jpg

Malgré les apparences, la commande ne modifie pas les noms des fichiers.

Appliquer les dates d'une photo à une autre photo

Si on veut uniquement appliquer la date de prise de vue :

exiftool -tagsFromFile fichier-source-meta -DateTimeOriginal fichier_cible

On peut appliquer toutes les dates disponibles. C'est vite fait mais peut-être pas assez sélectif pour ce qu'on voudrait :

exiftool -tagsFromFile fichier-source-meta -AllDates fichier_cible

On peut aussi appliquer toutes les méta-données. Encore plus vite fait, encore moins sélectif :

exiftool -tagsFromFile fichier-source-meta fichier_cible

Décrémenter la date des fichiers d'un répertoire

On décide d'appliquer la commande touch 7) à un ensemble de fichiers existants. Les solutions présentées peuvent être déclinées pour de multiples usages.

En utilisant la commande find8) :

$ find . -exec sh -c "touch -r {} -d '-1 hour' {}" \;

En utilisant une simple boucle9) for :

for i in *.JPG; do echo "traitement de $i"; touch -r $i -d '-1 hour' $i; done

Décrémenter la date des photos d'un répertoire (metadata)

En utilisant find10) (ici, on recule d'une heure et trois minutes) :

$ find *.JPG -exec jhead -ta-1:3:0 {} \;

En utilisant une boucle do:

for i in *.JPG; do echo "traitement de $i"; jhead -ta-1:3:0 $i; done

Aligner la date d'une photo sur celle de son fichier

Avec jhead

Si l'entête exif existe déjà :

jhead -dsft <motif de fichier(s)>

Si l'image n'a pas d'entête exif, on en crée une, à la volée :

jhead -mkexif -dsft <motif de fichier(s)>

Avec exiftool

exiftool -overwrite_original "-exif:datetimeoriginal<filemodifydate" <motif de fichier(s)>

Préfixer un nom de fichier par un numéro d'ordre

Suivant l'ordre chronologique des fichiers

jhead -n"%02i_%f" `ls -t *.jpeg`
La date du fichier peut être héritée des méta-données de la photo (cf supra) ou résulter d'un autre traitement, manuel (touch-like) ou automatique.

Suivant l'ordre alphabétique des noms de fichiers

jhead -n"%02i_%f" *.jpeg

variante utilisant ”find -exec11)

find *.jpeg -exec jhead -n"%02i_%f" {} \;

Aligner la chronologie des fichiers sur l'ordre alphabétique des noms de fichiers

On est un peu hors sujet et ça peut paraître bizarre mais cette opération peut être fort utile dans certains cas.

Le plus simplement :

touch *.jpeg
Cette méthode rapide donnera le résultat voulu dans de nombreux cas12) mais elle n'est pas rigoureuse. Elle ne garantit pas une date différente pour chaque fichier.

Avec xargs13) (ici, pour dater en fonction de l'ordre alphabétique inverse) :

ls -1r * | xargs -n 1 bash -c 'sleep 1 ;touch "$0"'
Afin de garantir des dates de fichiers différentes, cette commande rudimentaire consomme 1 seconde par fichier.
Pour garantir des dates de fichiers différentes sans imposer une attente, il est nécessaire de spécifier le résultat attendu avant de pouvoir définir l'algorithme à utiliser.
1)
Cela peut permettre de s'assurer que les photos seront toujours affichées par ordre alphabétique.
2)
Dans cet exemple, on aurait pu simplifier la syntaxe en écrivant “jhead -ta-1:3:0 -ft *.JPG. Utiliser find est une bonne pratique en raison de la richesse des situations que cette commande permettra de traiter.
3)
Le cas réel est celui d'un répertoire où se trouvent les photos venant de plusieurs appareil photo. Seul l'un d'entre eux n'était pas à l'heure.
4)
Découpage délibéré en deux commandes.
5)
Parce qu'elle fait ça bien et simplement. Et aussi, parce qu'elle peut servir à faire l'opération inverse, sans chambouler les méta-données de l'image initiale.
6)
Fournie avec le paquetage Exif handling tool.
7)
Parce que touch est la commande de base pour modifier une date de fichier et qu'elle dispose de la puissance et de la lisibilité de DATE STRING.
8)
L'avantage est qu'on dispose de toute la richesse de la commande find pour sélectionner les fichiers auxquels appliquer la modification. L'inconvénient est que la commande qui suit -exec ne doit avoir qu'un paramètre (-exec n'a pas la puissance de sh). On contourne le problème en demandant à -exec de lancer sh ;-)
9)
Qui permet d'ajouter des commandes additionnelles, si la modification de date n'est qu'une des opérations à réaliser…
10)
Pas besoin de shell puisque la commande jhead qui convient requiert un seul paramètre.
11)
Permet d'utiliser toute la puissance de collecte de find.
12)
Avec de forts présupposés.
13)
Si on a besoin d'un traitement plus complexe.