#1 Le 15/01/2012, à 15:21
- A.
[Script] Modification des tags images [résolu]
Bonjour,
J'aimerais ajouter des tags à une grosse quantité d'images.
Je me suis donc inspiré de ce qui a été fait ici et qui permet de renommer un groupe de fichier via un fichier texte.
Je n'y connais pas grand chose, mais je suis arrivé à un premier résultat :
#!/bin/bash
for fichier in `ls *.jpg *.png`
do
FILENAME=$fichier
SUBJECT=$(exiftool -Subject $fichier)
if [ "$SUBJECT" = "" ]
then
SUBJECT="Subject : aa"
fi
echo $FILENAME $SUBJECT >> test1
done
zenity --filename=test1 --width=800 --height=800 --editable --text-info --title='test' > test2
nbl=$(cat test1 | wc -l)
if [ "$nbl" = "$(cat test2 | wc -l)" ]
then
for ((i=1; i <= $nbl; i++))
do
Name1=$(awk 'NR == '$i' {print $1}' test1)
Keyword=$(awk 'NR == '$i' {print $NF}' test2)
exiftool -Subject=$Keyword $Name1
done
else
zenity --error --text="des lignes ont été supprimées ou ajoutées"
fi
rm *.*_original
rm test1
rm test2
Il y a cependant quelques problèmes :
- Je dois ajouter artificiellement un mot clé si l'image n'en a pas.
- Zenity met du temps à s'afficher (~6 sec. pour une quarantaine de fichiers). Je me demande s'il n'est pas possible de faire mieux.
- Les noms de fichiers avec espace ne sont pas bien gérés (si j'ai un fichier "a a.jpg" ça me génère 2 lignes dans zenity : "a" et "a.jpg").
- Pour les mots clés, j'aimerais récupérer tout ce qui se situe après "Subject : ". Pour l'instant je récupère la dernière chaîne via awk '{print $NF}' mais c'est source de problèmes.
Merci
Dernière modification par A. (Le 22/01/2012, à 23:53)
Hors ligne
#2 Le 21/01/2012, à 20:33
- A.
Re : [Script] Modification des tags images [résolu]
Mise à jour du post avec un premier script et quelques problèmes que je n'ai pas encore résolu.
Hors ligne
#3 Le 21/01/2012, à 21:34
- Levi59
Re : [Script] Modification des tags images [résolu]
Pour l'erreur d'espace dans les noms, c'est du à l'utilisation erronée de for...done avec ls.
Il faut passer par while read...done et lui transmettre la liste des fichiers.
while read
do
echo $REPLY
done <(find ${Repertoire} -iname *.jpg -iname *.png)
Hors ligne
#4 Le 21/01/2012, à 22:58
- A.
Re : [Script] Modification des tags images [résolu]
Ok. Par contre pour l'instant ça me donne l'erreur suivante :
./A ligne 16: Erreur de syntaxe près du symbole inattendu « <(find ${Repertoire} -iname *.jpg -iname *.png) »
./A: ligne 16: `done <(find ${Repertoire} -iname *.jpg -iname *.png)'
Hors ligne
#5 Le 22/01/2012, à 13:12
- Levi59
Re : [Script] Modification des tags images [résolu]
oups erreur de frappe :
remplacer
done <(find ...
par
done < <(find ...
Hors ligne
#6 Le 22/01/2012, à 16:07
- A.
Re : [Script] Modification des tags images [résolu]
En cherchant un peu, j'avais vu que l'erreur se situait là et j'avais déjà testé cette solution.
Ça me donne :
find: les chemins doivent précéder l'expression : b.jpg
Utilisation : find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [chemin...] [expression]
Finalement, j'ai vu qu'en ajoutant des guillemets ça résolvait cette erreur :
done < <(find ${Repertoire} -iname "*.jpg" -iname "*.png")
Mais le problème c'est que le fichier test1 est vide (donc plus rien ne s'affiche via zenity).
Hors ligne
#7 Le 22/01/2012, à 20:41
- Levi59
Re : [Script] Modification des tags images [résolu]
essaye ceci :
(maxdepth c'est pour limiter la "profondeur" de recherche)
while read;
do
echo $REPLY;
done < <(find $HOME/ -maxdepth 1 -type f -regex ".*\.\(jpg\|png\)")
Hors ligne
#8 Le 22/01/2012, à 21:51
- A.
Re : [Script] Modification des tags images [résolu]
Ça ne va toujours pas.
Voici le début :
while read fichier
do
FILENAME=$fichier
SUBJECT=$(exiftool -Subject $fichier)
if [ "$SUBJECT" = "" ]
then
SUBJECT="Subject : aa"
fi
echo $FILENAME $SUBJECT >> test1
done < <(find $HOME/ -maxdepth 1 -type f -regex ".*\.\(jpg\|png\)")
Ça me donne une erreur du type suivant pour chaque fichier dont le nom contient un espace :
/home/ubuntu/Images/Photos/a a.jpg 0 image files read 2 files could not be read
Dernière modification par A. (Le 22/01/2012, à 22:27)
Hors ligne
#9 Le 22/01/2012, à 22:28
- Hizoka
Re : [Script] Modification des tags images [résolu]
et avec :
find ${HOME} -maxdepth 1 -type f \( -name "*.jpg" -o -name "*.png" \)
c'est mieux ?
Perso je ferais ça pour simplifier le code :
while read
do
SUBJECT=$(exiftool -Subject ${REPLY})
[[ -z ${SUBJECT} ]] && SUBJECT="Subject : aa"
echo "${REPLY##*/} ${SUBJECT}" >> test1
done < <(find "${HOME}" -maxdepth 1 -type f \( -name "*.jpg" -o -name "*.png" \))
REPLY est la variable créée par read si aucun nom n'est donné.
-z ${SUBJECT} : si la variable est vide
${REPLY##*/} : n'affiche que le nom du fichier, inutile de mettre toute l'adresse si tu utilises maxdepth 1, ca veut dire que les fichiers sont dans ${HOME}
Dernière modification par Hizoka (Le 22/01/2012, à 22:40)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#10 Le 22/01/2012, à 22:35
- A.
Re : [Script] Modification des tags images [résolu]
Non, même résultat.
Par contre, le fait de travailler avec $HOME ne va pas vraiment. Pour l'instant ça n'a pas d'importance mais une fois terminé, il faudra travailler dans le dossier courant donc je crois qu'il faudra juste un "find . ".
Hors ligne
#11 Le 22/01/2012, à 22:37
- Hizoka
Re : [Script] Modification des tags images [résolu]
execute uniquement :
find ${HOME} -maxdepth 1 -type f \( -name "*.jpg" -o -name "*.png" \)
et donne le retour.
Par contre, le fait de travailler avec $HOME ne va pas vraiment. Pour l'instant ça n'a pas d'importance mais une fois terminé, il faudra travailler dans le dossier courant donc je crois qu'il faudra juste un "find . ".
Il suffit de remplacer ${HOLME} par ${PWD} qui designe le dossier courant.
perso je viens de tester chez moi et ca a fonctionné...
PS : je sais pas si tu as vu mais j'ai edité mon precedant message
- Pour les mots clés, j'aimerais récupérer tout ce qui se situe après "Subject : ". Pour l'instant je récupère la dernière chaîne via awk '{print $NF}' mais c'est source de problèmes.
Peux tu poster un retour de ta commande exiftool -Subject car je n'ai aucun fichier taggé...
zenity --filename=test1 --width=800 --height=800 --editable --text-info --title='test' > test2
l'edit ne te sert que pour des petites modifs ? pas de suppression de ligne ou d'ajout ?
Dernière modification par Hizoka (Le 22/01/2012, à 22:42)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#12 Le 22/01/2012, à 22:44
- A.
Re : [Script] Modification des tags images [résolu]
La commande en console donne :
/home/ubuntu/Images/Photos/Nouveau dossier/c.jpg
/home/ubuntu/Images/Photos/Nouveau dossier/a a.jpg
/home/ubuntu/Images/Photos/Nouveau dossier/b.jpg
Via le script, j'ai les erreurs suivantes :
File not found: dossier/c.jpg
File not found: dossier/a
File not found: a.jpg
File not found: dossier/b.jpg
Et l'affichage dans zenity est le suivant :
/home/ubuntu/Images/Photos/Nouveau dossier/c.jpg ======== /home/ubuntu/Images/Photos/Nouveau 1 image files read 1 files could not be read
/home/ubuntu/Images/Photos/Nouveau dossier/a a.jpg ======== /home/ubuntu/Images/Photos/Nouveau 1 image files read 2 files could not be read
/home/ubuntu/Images/Photos/Nouveau dossier/b.jpg ======== /home/ubuntu/Images/Photos/Nouveau 1 image files read 1 files could not be read
Hors ligne
#13 Le 22/01/2012, à 22:51
- A.
Re : [Script] Modification des tags images [résolu]
Je n'avais pas vu pour l'edit, je vais tester.
Pour l'edit, pas de grosse modif' s'il y a eu une réponse entre temps.
Pour exiftool, en console ça donne ceci :
exiftool -Subject b.jpg
Subject : bb, bb
Hors ligne
#14 Le 22/01/2012, à 22:52
- Hizoka
Re : [Script] Modification des tags images [résolu]
le soucis des espaces : encadre tes variables de "...
${REPLY} => "${REPLY}"
while read
do
# Recherche du Subject de l'image
SUBJECT=$(exiftool -Subject "${REPLY}")
# S'il n'y a pas de Subject, on lui en attribut un
[[ -z ${SUBJECT} ]] && SUBJECT="Subject : aa"
# Utilisation d'une variable pour lister les fichiers
test1+="${REPLY} ${SUBJECT}$'\n'"
done < <(find "${HOME}" -maxdepth 1 -type f \( -name "*.jpg" -o -name "*.png" \))
# Supprime le dernier saut de ligne de la variable test1
test1="${test1/%?}"
# Utilisation de zenity en chargeant les fichiers depuis la variable et enregistrant le tout dans une variable
test2=$(echo "${test1}" | zenity --width=800 --height=800 --editable --text-info --title='test')
# Calcul du nombre de ligne
nb1=$(wc -l <<< "${test1}")
nb2=$(wc -l <<< "${test2}")
Dernière modification par Hizoka (Le 22/01/2012, à 22:52)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#15 Le 22/01/2012, à 23:07
- A.
Re : [Script] Modification des tags images [résolu]
Ça a l'air de bien fonctionner pour les noms avec espaces, aussi bien du dossier que du fichier.
Par contre, le '\n' n'a pas l'air d'aller, le saut de ligne n'est pas fait :
c.jpg Subject : 123, 123 $'\n'a a.jpg Subject : aa bb $'\n'b.jpg Subject : bb, bb $'\n
J'ai testé plusieurs choses pour corriger ce saut de ligne mais pour l'instant rien.
Hors ligne
#16 Le 22/01/2012, à 23:22
- Hizoka
Re : [Script] Modification des tags images [résolu]
Pour ne recuperer que la valeur que tu veux :
SUBJECT=$(exiftool -Subject "${REPLY}")
# ca te donne par ex : "Subject : bb, bb"
SUBJECT=${SUBJECT#*: }
# on supprime tout jusqu'a ": " compris, ce qui donne : "bb, bb"
test1+="${REPLY}@@${SUBJECT}"$'\n'
# J'utiliserai un separateur special @@ (peut de chance de le trouver dans les fichiers ou subject)
# Une erreur de ma part pour le saut de ligne, maintenant c'est ok
et la fin :
# Calcul du nombre de ligne :
if [[ ${nb1} == ${nb2} ]]
then
while read
do
# ${REPLY##*@@} : efface tout jusqu'a @@ compris, donc il ne reste que le subject
# ${REPLY%%@@*} : efface tout jusqu'a @@ compris en partant de la fin, donc il ne reste que le fichier
# Utilise la liste de zenity, car s'il y a eu des modifs...
exiftool -Subject="${REPLY##*@@}" "${REPLY%%@@*}"
done <<< "${test2}"
else
zenity --error --text="des lignes ont été supprimées ou ajoutées"
fi
ce qui donnerait au final :
while read
do
# Recherche du Subject de l'image
SUBJECT=$(exiftool -Subject "${REPLY}") SUBJECT=${SUBJECT#*: }
# S'il n'y a pas de Subject, on lui en attribut un
[[ -z ${SUBJECT} ]] && SUBJECT="aa"
# Utilisation d'une variable pour lister les fichiers
test1+="${REPLY}@@${SUBJECT}"$'\n'
done < <(find "${HOME}" -maxdepth 1 -type f \( -name "*.jpg" -o -name "*.png" \))
# Supprime le dernier saut de ligne de la variable test1
test1="${test1/%?}"
# Utilisation de zenity en chargeant les fichiers depuis la variable et enregistrant le tout dans une variable
test2=$(echo "${test1}" | zenity --width=800 --height=800 --editable --text-info --title='test')
# Calcul du nombre de ligne
nb1=$(wc -l <<< "${test1}")
nb2=$(wc -l <<< "${test2}")
# Calcul du nombre de ligne :
if [[ ${nb1} == ${nb2} ]]
then
while read
do
# ${REPLY##*@@} : efface tout jusqu'a @@ compris, donc il ne reste que le subject
# ${REPLY%%@@*} : efface tout jusqu'a @@ compris en partant de la fin, donc il ne reste que le fichier
exiftool -Subject="${REPLY##*@@}" "${REPLY%%@@*}"
done <<< "${test2}"
else
zenity --error --text="des lignes ont été supprimées ou ajoutées"
fi
et tu n'utilises que des variables, pas de fichiers qui se balladent...
Si tu aimes Zenity, regarde ma signature.
Dernière modification par Hizoka (Le 22/01/2012, à 23:26)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#17 Le 22/01/2012, à 23:29
- Hizoka
Re : [Script] Modification des tags images [résolu]
et je pense que tu peux virer :
[[ -z ${SUBJECT} ]] && SUBJECT="aa"
si tu fais une verification avant de modifier le subject :
# N'executera la commande que si la partie subject existe
[[ ${REPLY##*@@} ]] && exiftool -Subject="${REPLY##*@@}" "${REPLY%%@@*}"
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#18 Le 22/01/2012, à 23:35
- A.
Re : [Script] Modification des tags images [résolu]
Les variables à la place des fichiers, c'est beaucoup mieux et ça réduit le script.
Pour l'instant j'ai :
ligne 19: Caractère de fin de fichier (EOF) prématuré lors de la recherche du « ' » correspondant
ligne 36: Erreur de syntaxe : fin de fichier prématurée
Est-ce que la correction du '\n n'y est pas pour quelque chose ?
J'ai tenté de corrigé mais ça me renvoie simplement l'erreur à d'autre ligne sans que je ne vois quoique ce soit.
Hors ligne
#19 Le 22/01/2012, à 23:43
- Hizoka
Re : [Script] Modification des tags images [résolu]
fais gaffe, j'avais modifié mon code, la ligne du saut de ligne a changé :
test1+="${REPLY}@@${SUBJECT}"$'\n"
=>
test1+="${REPLY}@@${SUBJECT}"$'\n'
C'était ça ou pas ?
Tiens revoila le code en ayant viré le subject par defaut :
while read
do
# Recherche du Subject de l'image
SUBJECT=$(exiftool -Subject "${REPLY}") SUBJECT=${SUBJECT#*: }
# Utilisation d'une variable pour lister les fichiers
test1+="${REPLY}@@${SUBJECT}"$'\n'
done < <(find "${HOME}" -maxdepth 1 -type f \( -name "*.jpg" -o -name "*.png" \))
# Supprime le dernier saut de ligne de la variable test1
test1="${test1/%?}"
# Utilisation de zenity en chargeant les fichiers depuis la variable et enregistrant le tout dans une variable
test2=$(echo "${test1}" | zenity --width=800 --height=800 --editable --text-info --title="test")
# Calcul du nombre de ligne
nb1=$(wc -l <<< "${test1}")
nb2=$(wc -l <<< "${test2}")
# Calcul du nombre de ligne :
if [[ ${nb1} == ${nb2} ]]
then
while read
do
# ${REPLY##*@@} : efface tout jusqu'a @@ compris, donc il ne reste que le subject
# ${REPLY%%@@*} : efface tout jusqu'a @@ compris en partant de la fin, donc il ne reste que le fichier
# N'executera la commande que si la partie subject existe
[[ ${REPLY##*@@} ]] && exiftool -Subject="${REPLY##*@@}" "${REPLY%%@@*}"
done <<< "${test2}"
else
zenity --error --text="des lignes ont été supprimées ou ajoutées"
fi
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#20 Le 22/01/2012, à 23:44
- A.
Re : [Script] Modification des tags images [résolu]
si tu fais une verification avant de modifier le subject :
# N'executera la commande que si la partie subject existe [[ ${REPLY##*@@} ]] && exiftool -Subject="${REPLY##*@@}" "${REPLY%%@@*}"
Qu'elle ait ou non de subject, il faudrait que l'image apparaisse correctement dans zenity (même syntaxe pour pouvoir tout traiter de la même façon).
C'est pour ça que j'avais fait cette bidouille. Pas très propre mais j'avais l'impression que ça rendrait la suite plus simple.
Hors ligne
#21 Le 22/01/2012, à 23:48
- Hizoka
Re : [Script] Modification des tags images [résolu]
Ba ca n'empechera rien là...
si y a pas de subject ca donnera
/home/hizoka/caca.jpg@@caca
/home/hizoka/fichierbidon.jpg@@
/home/hizoka/pipi.jpg@@pipi
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#22 Le 22/01/2012, à 23:51
- A.
Re : [Script] Modification des tags images [résolu]
fais gaffe, j'avais modifié mon code, la ligne du saut de ligne a changé :
test1+="${REPLY}@@${SUBJECT}"$'\n" => test1+="${REPLY}@@${SUBJECT}"$'\n'
C'était ça ou pas ?
Oui, j'avais la première ligne.
Avec la vérification ça marche aussi très bien.
Merci beaucoup !
J'avais déjà passé un certain temps à chercher pour mon premier résultat et j'étais encore loin de ce résultat qui résout tout ce que j'avais noté.
Hors ligne
#23 Le 22/01/2012, à 23:55
- Hizoka
Re : [Script] Modification des tags images [résolu]
ravi d'avoir était utile.
Hesite pas à regarder mon generateur de fenetre zenity, qui est totalement adapté a ce genre de petit script.
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#24 Le 23/01/2012, à 00:05
- A.
Re : [Script] Modification des tags images [résolu]
Pour revenir au script, j'ajouterai juste de quoi supprimer les originaux créés par exiftool à la fin :
rm *.*_original
J'ai commencé à regarder ton générateur et ça peut être intéressant. J'approfondirai un peu plus tard.
Merci.
Hors ligne