Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 19/12/2010, à 23: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 tongue

Merci d'avance,
bece

Dernière modification par bece (Le 21/12/2010, à 11:41)


"L'informatique, c'est l'art de passer 15 jours à gagner 5 millisecondes"

Hors ligne

#2 Le 20/12/2010, à 00: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 20/12/2010, à 00: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, à 04: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, à 10: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, à 12: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 smile (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, à 12: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, à 12: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, à 13:02

Postmortem

Re : [RESOLU] Traitement avec find

bece a écrit :

Ok, merci, mais alors comment intégrer le retour de ce -printf dans le -exec du find ?

Je ne sais point !

bece a écrit :

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, à 13:05

bece

Re : [RESOLU] Traitement avec find

Ha oui, j'avais même pas vu roll
Ben je n'ai plus qu'a trouver comment intégrer ce résultat dans l'option -exec et ce sera bon smile

Merci,
bece


"L'informatique, c'est l'art de passer 15 jours à gagner 5 millisecondes"

Hors ligne

#10 Le 20/12/2010, à 13: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, à 13: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, à 15: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, à 16: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, à 18: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, à 18:50

FRUiT

Re : [RESOLU] Traitement avec find

bece a écrit :

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, à 19: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, à 19: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, à 19:16)


"L'informatique, c'est l'art de passer 15 jours à gagner 5 millisecondes"

Hors ligne

#17 Le 20/12/2010, à 20: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 !!! tongue


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#18 Le 20/12/2010, à 21: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, à 02:49

ehmicky

Re : [RESOLU] Traitement avec find

bece a écrit :

Merci pour vos réponses,

Avec le -printf, je n'obtiens effectivement que le nom de l'image smile (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 :

ehmicky a écrit :

Salut,
Sinon, tu peux essayer ça :

find ... -execdir exiftool -keywords="$(readlink -f .)" ...

Essaie avec -execdir, et ça devrait fonctionner smile
Et tel que je l'ai noté, sans le echo $(dirname `readlink... big_smile, il y a en plus au moins 4 redondances sur cette simple ligne de code big_smile
Par exemple :

find "$DIR" -type f -name "*.$EXT" -execdir exiftool -keywords="$(readlink -f .)" -overwrite_original \{\} \;

Dernière modification par ehmicky (Le 21/12/2010, à 02: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, à 09: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, à 09: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, à 09: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, à 09: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, à 09:46

ehmicky

Re : [RESOLU] Traitement avec find

Postmortem a écrit :

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"
Postmortem a écrit :

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 big_smile big_smile

Dernière modification par ehmicky (Le 21/12/2010, à 09: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, à 11:41

bece

Re : [RESOLU] Traitement avec find

@Postmortem : par ici wink :

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 smile

@ehmicky, effectivement cela fonctionne bien smile
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, à 11: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