#1 Le 19/12/2010, à 22:42
- bece
[RESOLU] Traitement avec find
Bonsoir à tous,
Je suis en train de réaliser un petit script pour tagger des images. Malheureusement je bute sur un problème de find.
Voici le script :
#!/bin/bash
# Ce script écrit les tags keywords (IPTC) et Subject (XMP)
# Auteur : bece
#
clear
DIR="$1" # On récupère le répertoire spécifié par l'utilisateur
EXT="$2" # On récupère l'extension que souhaite l'utilisateur
# on teste le nombre d'arguments
if [ $# -ne 2 ]
then
echo "Nombre d'arguments incorrect"
echo "Usage : $0 repertoire extension"
echo "Exemple : $0 $HOME/Pictures/ jpg"
exit 1
fi
# on teste que le premier argument soit un repertoire
if [ ! -d $dir ] ; then
echo "$dir n'est pas un repertoire"
echo "Usage : $0 repertoire extension"
exit 2
fi
# On recherche et on tag tous les fichiers contenu dans le répertoire et tous ses sous répertoires
# find "$DIR" -type f -name "*.$EXT" -exec exiftool -keywords="" -overwrite_original "{}" \;
find "$DIR" -type f -name "*.$EXT" -exec echo $(basename {} | awk -FS="/" '{print $NF}') \;
Ce script qui au lieu de m'afficher juste le nom du fichier, m'affiche :
/home/bece/Pictures/Artists/mymi/Devil Eyes.jpg
/home/bece/Pictures/Artists/mymi/Livre elfette.jpg
/home/bece/Pictures/Artists/mymi/vampire.jpg
/home/bece/Pictures/Artists/mymi/Carnage.jpg
/home/bece/Pictures/Artists/mymi/Elfette.jpg
Si vous savez pourquoi je suis preneur.
Ou alors, peut-être existe-t-il un moyen de faire ceci en bash :
find "$DIR" -type f -name "*.$EXT" -exec exiftool -keywords="dossier où est contenu l'image" -overwrite_original "{}" \;
Et "dossier où est contenu l'image" est ce que je cherche à récupérer dans le find après l'optione -exec mais je n'y arrive pas beaucoup
Merci d'avance,
bece
Dernière modification par bece (Le 21/12/2010, à 10:41)
"L'informatique, c'est l'art de passer 15 jours à gagner 5 millisecondes"
Hors ligne
#2 Le 19/12/2010, à 23:06
- FRUiT
Re : [RESOLU] Traitement avec find
find "$DIR" -type f -name "*.$EXT" -exec echo $(basename {}) \; | awk -F'/' '{print $NF}'
Ou même plutot
find "$DIR" -type f -name "*.$EXT" | awk -F'/' '{print $NF}'
Pour le nom du dossier je pense que dirname au lieu de basename devrait donner de bons résultats.
Dernière modification par FRUiT (Le 19/12/2010, à 23:11)
Neon Suite by FRUiT (kde4.6) [url]http://[Merci de relire les règles]/yzm7cee[/url]
"Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley)
clean
Hors ligne
#3 Le 20/12/2010, à 03:18
- ehmicky
Re : [RESOLU] Traitement avec find
Salut,
Sinon, tu peux essayer ça :
find ... -execdir exiftool -keywords="$(readlink -f .)" ...
Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?
Hors ligne
#4 Le 20/12/2010, à 09:05
- Postmortem
Re : [RESOLU] Traitement avec find
Salut,
Sinon, avec printf dans find :
find "$DIR" -type f -name "*.$EXT" -printf "%f\n"
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#5 Le 20/12/2010, à 11:10
- bece
Re : [RESOLU] Traitement avec find
Merci pour vos réponses,
Avec le -printf, je n'obtiens effectivement que le nom de l'image (cela fonctionne également avec la deuxième commande de FRUiT)
@ehmicky : readlink -f . me retourne le dossier courant.
J'ai essayé ceci pour récupérer le répertoire où est contenu l'image :
find "$DIR" -type f -name "*.$EXT" -exec echo $(dirname `readlink -f {}` | awk -F'/' '{printf $NF}') \;
Mai cela me retourne le dossier courant c'est tout.
bece
bece
bece
Donc il y a du progrès, j'arrive bien à couper avec awk, mais le dirname `readlink -f {}` ne passe pas du tout il semblerait.
bece
"L'informatique, c'est l'art de passer 15 jours à gagner 5 millisecondes"
Hors ligne
#6 Le 20/12/2010, à 11:31
- Postmortem
Re : [RESOLU] Traitement avec find
Pour avoir la liste des dossiers contenant chaque fichier :
find "$DIR" -type f -name "*.$EXT" -printf "%h\n"
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#7 Le 20/12/2010, à 11:38
- bece
Re : [RESOLU] Traitement avec find
Ok, merci, mais alors comment intégrer le retour de ce -printf dans le -exec du find ?
De plus j'ai essayé ceci pour récupérer juste le dossier qui m'intéresse:
find "$DIR" -type f -name "*.$EXT" -printf "%h\n" | awk -F'/' '{printf $NF}'
Mais bon le retour, le \n du printf je ne sais pas où il est partie ^^
eremissmysteremissmysteremissmysteremissmysteremissmysteremissmysteremissmysteremissmysteremissmysteremissmysteremissmysteremissmysteremissmysteremissmysteremissmysteremissmysteremissmysteremissmysteremissmysteremissmysteremissmysteremissmysteremissmysteremissmystereadamskaadamskagurvangurvangurvangurvantrustgothlypopopmdtof3gege15000gege15000gege15000gege15000gege15000gege15000gege15000gege15000gege15000gege15000gege15000gege15000gege15000gege15000gege15000gege15000gege15000gege15000gege15000gege15000gege15000gege15000gege15000gege15000gege15000gege15000gege15000gege15000gege15000gege15000gege15000gege15000gege15000gege15000gege15000gege15000gege15000gege15000gege15000gege15000gege15000gege15000gege15000gege15000gege15000gege15000gege15000blackbeastmymimymimymimymimymimymimymimymimymimymi
"L'informatique, c'est l'art de passer 15 jours à gagner 5 millisecondes"
Hors ligne
#8 Le 20/12/2010, à 12:02
- Postmortem
Re : [RESOLU] Traitement avec find
Ok, merci, mais alors comment intégrer le retour de ce -printf dans le -exec du find ?
Je ne sais point !
De plus j'ai essayé ceci pour récupérer juste le dossier qui m'intéresse:
find "$DIR" -type f -name "*.$EXT" -printf "%h\n" | awk -F'/' '{printf $NF}'
Mais bon le retour, le \n du printf je ne sais pas où il est partie ^^
Dans awk, il faut mettre print à la place de printf :
find "$DIR" -type f -name "*.$EXT" -printf "%h\n" | awk -F'/' '{print $NF}'
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#9 Le 20/12/2010, à 12:05
- bece
Re : [RESOLU] Traitement avec find
Ha oui, j'avais même pas vu
Ben je n'ai plus qu'a trouver comment intégrer ce résultat dans l'option -exec et ce sera bon
Merci,
bece
"L'informatique, c'est l'art de passer 15 jours à gagner 5 millisecondes"
Hors ligne
#10 Le 20/12/2010, à 12:16
- Postmortem
Re : [RESOLU] Traitement avec find
C'est quoi la commande que tu veux passer ? Tu peux en mettre un exemple sans le find
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#11 Le 20/12/2010, à 12:54
- bece
Re : [RESOLU] Traitement avec find
La commande, c'est le retour du find justement et sur ce retour (qui contient les noms de fichiers) récupérer juste le nom du dossier.
En clair ça ressemblerait à ça (c'est pour montrer ce que je souhaite réaliser) :
find "$DIR" -type f -name "*.$EXT" d=$(-printf "%h\n" | awk -F'/' '{print $NF}') -exec exiftool -keywords="$d" -overwrite_original "{}" \;
"L'informatique, c'est l'art de passer 15 jours à gagner 5 millisecondes"
Hors ligne
#12 Le 20/12/2010, à 14:42
- Postmortem
Re : [RESOLU] Traitement avec find
Sur un fichier /home/tutu/images/vacances/titi.jpg, la commande serait exiftool -keywords=vacances -overwrite_original titi.jpg
C'est bien ça ??
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#13 Le 20/12/2010, à 15:56
- bece
Re : [RESOLU] Traitement avec find
Oui ce serait ça, c'est pourquoi je récupère tous les fichier avec le find.
"L'informatique, c'est l'art de passer 15 jours à gagner 5 millisecondes"
Hors ligne
#14 Le 20/12/2010, à 17:23
- Postmortem
Re : [RESOLU] Traitement avec find
J'ai une solution mais sans passer par le '-exec' de find... J'ai pas réussi après plusieurs tentatives !
Donc voilà ce que je propose :
find "$DIR" -type f -name "*.$EXT" -fprintf ~/fic_tmp.sh "exiftool -keywords=\"%h\" -overwrite_original \"%p\"\n"
sed -i 's#\(-keywords="\)..*/\(..*" -overwrite_original\)#\1\2#' ~/fic_tmp.sh
chmod +x ~/fic_tmp.sh
~/fic_tmp.sh
Enfin... En me relisant, je me dis que c'est pas très propre !!!
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#15 Le 20/12/2010, à 17:50
- FRUiT
Re : [RESOLU] Traitement avec find
La commande, c'est le retour du find justement et sur ce retour (qui contient les noms de fichiers) récupérer juste le nom du dossier.
find "$DIR" -type f -name "*.$EXT" | awk -F'/' '{OFS="/"; $NF=""; print}'
[EDIT] ah pardon je crois que j'ai mal saisi le problème...
Dernière modification par FRUiT (Le 20/12/2010, à 18:01)
Neon Suite by FRUiT (kde4.6) [url]http://[Merci de relire les règles]/yzm7cee[/url]
"Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley)
clean
Hors ligne
#16 Le 20/12/2010, à 18:14
- bece
Re : [RESOLU] Traitement avec find
Merci cela fonctionne, mais tu m'expliquer un peu comment ça fonctionne, je vois pas trop.
En faîte c'est surtout le sed que je ne comprend pas. (je ne suis pas à l'aise avec cette commande)
En tout cas merci encore.
bece
EDIT : Oui le problème était de réussir à récupérer le nom du répertoire de l'image qu'a trouver find et d'envoyer l'image et le nom du répertoire dans l'option -exec du find en question.
Dernière modification par bece (Le 20/12/2010, à 18:16)
"L'informatique, c'est l'art de passer 15 jours à gagner 5 millisecondes"
Hors ligne
#17 Le 20/12/2010, à 19:05
- Postmortem
Re : [RESOLU] Traitement avec find
C'est vrai que le sed, c'est souvent galère à lire, c'est pour ça que je disais que c'était pas propre (d'ailleurs, suis sûr que si je revois ma commande dans 6 mois, je vais mettre du temps à comprendre ce que je voulais faire !!)
Alors, je vais essayer d'expliquer :
's#tutu#toto#' : substitution de tutu par toto ; en général, on écrit 's/tutu/toto/' mais quand il y a des slash dans ce que l'on recherche, c'est plus simple de mettre un autre caractère... On aurait très bien pu mettre 's|tutu|toto|'
\(xxxxxxxxxx\) : les parenthèses "antislashée", ça permet de pouvoir rappeler ce qui est "matché" dans les parenthèses (ici xxxxxxxxxx) par \1 (pour les premières parenthèses ; les 2èmes parenthèses sont rappelées par \2 etc...)
- Un exemple : sed 's/\(titi\)/toto\1/' fic.tmp : cette commande remplacera la première occurrence de titi sur chaque ligne par tototiti
- ou encore : sed 's/\(tata\)\(toto\)/\2\1/' : ça transforme tatatoto en tototata
\(-keywords="\)..*/\(..*" -overwrite_original\) : on recherche une chaîne composée de -keywords=" (cette chaîne étant mise dans le tampon 1) suivi de n'importe quelle suite de caractères se terminant par / (..*/). Tout ce qui suit le dernier slash jusqu'à " -overwrite_original est mis dans le tampon 2
Et donc avec 's#\(-keywords="\)..*/\(..*" -overwrite_original\)#\1\2#', on supprime ce qu'il y a entre le tampon 1 et le tampon 2.
Le -i de sed permet de travailler directement sur le fichier, sinon, il renvoie le résultat à l'écran sans modifier le fichier.
C'est pas très très clair mais bon, je ne suis pas un très bon "explicationneur" !!! Peut-être qu'un bon qui passe par ici pourra donner des précisions ou expliquer plus mieux que moi ! Ou nous donner une solution avec le -exec !!!
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#18 Le 20/12/2010, à 20:36
- bece
Re : [RESOLU] Traitement avec find
Ok, je comprend mieux. Merci.
"L'informatique, c'est l'art de passer 15 jours à gagner 5 millisecondes"
Hors ligne
#19 Le 21/12/2010, à 01:49
- ehmicky
Re : [RESOLU] Traitement avec find
Merci pour vos réponses,
Avec le -printf, je n'obtiens effectivement que le nom de l'image (cela fonctionne également avec la deuxième commande de FRUiT)
@ehmicky : readlink -f . me retourne le dossier courant.J'ai essayé ceci pour récupérer le répertoire où est contenu l'image :
find "$DIR" -type f -name "*.$EXT" -exec echo $(dirname `readlink -f {}` | awk -F'/' '{printf $NF}') \;
Mai cela me retourne le dossier courant c'est tout.
bece bece bece
Donc il y a du progrès, j'arrive bien à couper avec awk, mais le dirname `readlink -f {}` ne passe pas du tout il semblerait.
bece
J'ai noté -execdir, pas -exec :
Salut,
Sinon, tu peux essayer ça :find ... -execdir exiftool -keywords="$(readlink -f .)" ...
Essaie avec -execdir, et ça devrait fonctionner
Et tel que je l'ai noté, sans le echo $(dirname `readlink... , il y a en plus au moins 4 redondances sur cette simple ligne de code
Par exemple :
find "$DIR" -type f -name "*.$EXT" -execdir exiftool -keywords="$(readlink -f .)" -overwrite_original \{\} \;
Dernière modification par ehmicky (Le 21/12/2010, à 01:57)
Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?
Hors ligne
#20 Le 21/12/2010, à 08:13
- Postmortem
Re : [RESOLU] Traitement avec find
ehmicky : chez moi, avec -exec ou -execdir, le résultat est le même, "$(readlink -f .)" est remplacé, pour chaque fichier trouvé, par le nom du répertoire d'où j'ai lancé la commande.
"$(readlink -f .)" doit être exécuté avant le find.
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#21 Le 21/12/2010, à 08:17
- ehmicky
Re : [RESOLU] Traitement avec find
C'est bizarre, ça marche de mon côté, ça donne le dirname du fichier en cours de procession par find.
Que te donnes :
find /etc -execdir readlink -f . \;
Chez moi, ça me donne le dirname de chaque fichier dans /etc
Edit : ah oui mais comme tu le dis :
find /etc/ -execdir echo "$(readlink -f .)" \;
ne marche pas car readlink est exécuté dans un subshell.
Sinon :
while read
do
exiftool -keywords="${REPLY%/*}" -overwrite_original "$REPLY"
done < <(find "$DIR" -type f -name "*.$EXT")
Il faut que DIR soit un chemin absolu (s'il peut être relatif, il suffit de le remplacer par "$(readlink -f "$DIR")").
Mais il doit y avoir mieux que ça...
Dernière modification par ehmicky (Le 21/12/2010, à 08:41)
Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?
Hors ligne
#22 Le 21/12/2010, à 08:31
- Postmortem
Re : [RESOLU] Traitement avec find
Et si j'ai bien compris ce que voulais bece, il ne veut pas comme résultat -keywords=/home/bece/Images/vacances_2010 mais -keywords=vacances_2010 par exemple.
Sinon, dans quel paquet on trouve exiftool ?? Ça m'a l'air pas mal !
Et ehmicky, message à 1h49 hier soir et hop, réponse direct vers 8h20 ce matin... Faut dormir !!! lol
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#23 Le 21/12/2010, à 08:46
- ehmicky
Re : [RESOLU] Traitement avec find
Et si j'ai bien compris ce que voulais bece, il ne veut pas comme résultat -keywords=/home/bece/Images/vacances_2010 mais -keywords=vacances_2010 par exemple.
Sinon, dans quel paquet on trouve exiftool ?? Ça m'a l'air pas mal !
Si c'est le cas, faudrait qu'il remplace :
exiftool -keywords="${REPLY%/*}" -overwrite_original "$REPLY"
par :
exiftool -keywords="$(basename "${REPLY%/*}")" -overwrite_original "$REPLY"
Et ehmicky, message à 1h49 hier soir et hop, réponse direct vers 8h20 ce matin... Faut dormir !!! lol
J'ai des horaires très spéciales
Dernière modification par ehmicky (Le 21/12/2010, à 08:51)
Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?
Hors ligne
#24 Le 21/12/2010, à 10:41
- bece
Re : [RESOLU] Traitement avec find
@Postmortem : par ici :
libimage-exif-perl - Perl module to extract EXIF information from image files
libimage-exiftool-perl - Library and program to read and write meta information in multimedia files
J'utilise ce paquet pour éviter d'être dépendant de la base de données de shotwell
@ehmicky, effectivement cela fonctionne bien
J'ai une question quelle est la différence entre
done << (find "$DIR" -type f -name "*.$EXT")
et
done < <(find "$DIR" -type f -name "*.$EXT")
(Différence au niveau des chevrons)
bece
"L'informatique, c'est l'art de passer 15 jours à gagner 5 millisecondes"
Hors ligne
#25 Le 21/12/2010, à 10:47
- Postmortem
Re : [RESOLU] Traitement avec find
Merci bece !
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne