Corriger les informations Exif de plusieurs fichiers images
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.