Outils personnels
Vous êtes ici : Accueil GNU / Linux Corriger les informations Exif de plusieurs fichiers images
Actions sur le document
  • Send this page to somebody
  • Print this page
  • Add Bookmarklet

Corriger les informations Exif de plusieurs fichiers images

Par Pierre-Yves Landuré - Dernière modification 22/01/2009 11:34

Je me suis récemment retrouvé devant des images dont les mots clefs Exif étaient mal saisis (ils était séparé par des "-" au lieu de "," (et oui, ça a son importance)). J'ai donc du réfléchir à un moyen d'automatiser la correction de cette mauvaise saisie. Cet article présente la solution à laquelle j'ai abouti.

Prérequis

Pour modifier les informations Exif de nos images, nous allons avoir besoin de l'outil exiftool. Pour l'installer, utilisez la commande :

sudo apt-get install libimage-exiftool-perl

Présentation de la solution

La première étape consiste à récupérer une liste des fichiers images à mettre à jour. Pour ce faire, nous nous plaçons dans le dossier contenant ces images, et nous utilisons la commande find pour obtenir une liste de tous les fichiers présents dans ce dossier :

find ./ -type f

Vous pouvez aussi limiter la liste à un type de fichier donné. Par exemple, pour obtenir la liste des images avec une extension ".tif" :

find ./ -type f -name "*.tif"

Nous disposons maintenant d'une liste des fichiers images présents dans le dossier traité. Nous devons en extraire les informations Exif que nous souhaitons mettre à jour. Dans mon cas, je suis intéréssé par la valeur du champ "Subject":

find ./ -type f -name "*.tif" | \
while read IMAGE_FILE; do
  exiftool -q -s -s -s -m -fast -ScanForXMP -Subject "$IMAGE_FILE"
done

Nous avons maintenant la liste des mots clefs par fichier. Nous allons remplacer les tirets par des saut de ligne:

find ./ -type f -name "*.tif" | \
while read IMAGE_FILE; do
  exiftool -q -s -s -s -m -fast -ScanForXMP -Subject "$IMAGE_FILE" \
| sed -e "s/-/\n/g"
done

Nous allons maintenant utiliser les mots clefs que nous avons obtenu pour reconstruire la liste des mots clefs de notre fichier image:

find ./ -type f -name "*.tif" | \
while read IMAGE_FILE; do
  KEYWORDS=$(exiftool -q -s -s -s -m -fast -ScanForXMP -Subject "$IMAGE_FILE" \
| sed -e "s/-/\n/g")
# We reset the file keywords :
exiftool -Subject= -Keywords= "$IMAGE_FILE"
# We readd the keywords properly :
echo "$KEYWORDS" | xargs -iKEYWORD exiftool -Subject+="KEYWORD" -Keywords+="KEYWORD" "$IMAGE_FILE"
done

Cette première version de la solution est fonctionnelle, mais elle réécrit le fichier autant de fois qu'il y a de mots clefs. Ce n'est pas très efficace. Nous allons donc utiliser le résultat de sed pour constuire une ligne de commande qui ajoutera tous les mots clefs en une seule fois.

La solution finale est assez complexe, car il faut prendre en considération la possibilité que les mots clefs contiennent un espace. Voici la solution à laquelle j'ai abouti. Je ne pense pas que ce soit la meilleure, mais elle est fonctionnelle :

find ./ -type f -name "*.tif" | \
while read IMAGE_FILE; do
# We build an efficient command line:
COMMAND_ARGS=$(exiftool -q -s -s -s -m -fast -ScanForXMP -Subject "$IMAGE_FILE" \
| sed -e "s/-/\n/g" | \
while read KEYWORD; do
if [ ! -z "$KEYWORD" ]; then
echo -n " -Subject=\"$KEYWORD\" -Keywords=\"$KEYWORD\""
fi
 done)

# And we apply it:
/bin/sh -c "exiftool $COMMAND_ARGS \"$IMAGE_FILE\""
done

Dans un premier temps, je construit à l'aide d'echo la ligne de commande a appliquer à exiftool, et je l'assigne à la variable $COMMAND_ARGS. J'utilise ensuite la commande /bin/sh pour éxecuter ExifTool avec ces arguments.

Solution finale

Voici la ligne de commande que j'ai utilisée pour mettre à jour mes mots clefs mal saisis (séparé par des tirets au lieu de virgules) et les remettre au propre. Par rapport à la solution précédente, j'ai simplement ajouté une option pour désactiver la sauvegarde des fichiers images originaux (je dispose d'une copie de ces fichiers dans un autre dossier). Lorsque la manipulation affecte plusieurs centaines de fichiers, ce genre de commande est un "life-saver" :):
find ./ -type f -name "*.tif" | \
while read IMAGE_FILE; do
# We build an efficient command line:
COMMAND_ARGS=$(exiftool -q -s -s -s -m -fast -ScanForXMP -Subject "$IMAGE_FILE" \
| sed -e "s/-/\n/g" | \
while read KEYWORD; do
if [ ! -z "$KEYWORD" ]; then
echo -n " -Subject=\"$KEYWORD\" -Keywords=\"$KEYWORD\""
fi
 done)

# And we apply it:
/bin/sh -c "exiftool -overwrite_original $COMMAND_ARGS \"$IMAGE_FILE\""
done

Remerciements

  • Merci à Phil Harvey qui à créé l'outil ExifTool.

Réalisé avec Plone

Ce site respecte les normes suivantes :

Wikio