Vous êtes ici : Accueil / Développement / Shell Unix / Corriger les informations Exif de plusieurs fichiers images

Corriger les informations Exif de plusieurs fichiers images

Par Pierre-Yves Landuré Dernière modification 24/08/2011 01:34

Ayant été confronté à des images ayant des mots clefs Exif mal saisis (séparés par des "-" au lieu de ","). j'ai travaillé à un moyen d'automatiser la correction de cette mauvaise saisie. Cet article présente la solution à laquelle j'ai abouti.

Prérequis

Cet article utilise l'outil exiftool pour modifier les informations Exif des images. Installez-le :

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. Placez-vous dans le dossier contenant ces images, et utilisez la commande find pour obtenir une liste de tous les fichiers présents dans ce dossier :

find ./ -type f

Vous pouvez 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"

La commande ci-dessus liste les fichiers images présents dans le dossier traité. Il faut en extraire les informations Exif à mettre à jour. Par exemple, pour le champ "Subject":

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

A ce point, vous avez la liste des mots clefs par fichier. Remplacez 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

Utilisez les mots clefs obtenus pour reconstruire la liste des mots clefs du 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 efficace. Une solution est d'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. Ce n'est sans doute pas 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, la ligne de commande à appliquer à exiftool est construite à l'aide d'echo et assignée à la variable $COMMAND_ARGS. Ensuite, la commande /bin/sh est utilisée pour éxecuter ExifTool avec les arguments contenus dans $COMMAND_ARGS.

Solution finale

Voici la ligne de commande utilisée pour mettre à jour les 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, une option pour désactiver la sauvegarde des fichiers images originaux a été ajoutée. 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.