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 07/02/2011, à 18:27

tooney

[exiv2] - récupération de la chaine retour

Bonjour à tous smile

Voici mon problème. J'utilise la commande "exiv2" afin de renommer des fichiers .jpg contenant des données EXIF.

Pour ceux qui ne connaissent pas, cela signifie qu'un fichier .jpg contient des infos telles que la date, l'heure de prise de vue, le modèle d'appareil photo,...

Par exemple, un fichier "image.jpg" devient "20050214-04h16m58.jpg" grâce à la commande :

exiv2 -Fr %Y%m%d-%Hh%Mm%S mv image.jpg

Par contre, je souhaite intégrer cette commande dans un script shell, et récupérer la valeur de retour de cette commande, à savoir le nouveau nom de mon fichier (20050214-04h16m58.jpg).

Donc dans mon script, je mets ceci :

nom_fichier=$(exiv2 -Fr %Y%m%d-%Hh%Mm%S mv image.jpg)

Le renommage du fichier a bien lieu, mais lorsque je fais :

echo $nom_fichier

ça me sort une chaine vide...

Du coup je suis embêté pour continuer mon script. Quelqu'un voit-il une explication ?

Dernière modification par tooney (Le 07/02/2011, à 18:35)


Loi de Bonaldi appliquée à Linux : L’expérience prouve que c’est lorsqu’on dit « tu vas voir, linux c’est facile » que se produisent les pannes.

Hors ligne

#2 Le 07/02/2011, à 18:42

Vysserk3

Re : [exiv2] - récupération de la chaine retour

Salut,
La commande que tu mets dans $ ( ... ), c'est juste une commande de renommage du fichier, elle ne renvoie rien, donc elle ne renvoie pas le nouveau nom que tu mets au fichier wink

Hors ligne

#3 Le 07/02/2011, à 18:48

tooney

Re : [exiv2] - récupération de la chaine retour

Merci pour ta réponse.

Suis-je bête... Effectivement tu as raison! Comme si j'avais fait tout simplement un :

nom_fichier=$(mv ancien_nom.jpg nouveau_nom.jpg)

Evidemment que ça ne renvoie rien vers la sortie standard... Quelqu'un voit-il un moyen simple de récupérer le nom de fichier sans avoir à trop se casser la tête?

Dernière modification par tooney (Le 07/02/2011, à 18:48)


Loi de Bonaldi appliquée à Linux : L’expérience prouve que c’est lorsqu’on dit « tu vas voir, linux c’est facile » que se produisent les pannes.

Hors ligne

#4 Le 07/02/2011, à 19:26

cracolinux

Re : [exiv2] - récupération de la chaine retour

Ça, ça marche chez moi.
Mais, il y a des gens ici qui peuvent te faire ça plus simplement je pense, ils vont débarquer...

nom_fichier="$( exiv2 image.jpg | grep 'Horoda' | cut -d : -f 2-5 | sed s/\ // | sed s/\ /-/ ).jpg"

Pixup : postez vos images vite et bien - Wificheck : Aidez nous à vous aider

« Ne devenez jamais pessimiste. Un pessimiste a plus souvent raison qu'un optimiste, mais l'optimiste s'amuse plus — et aucun des deux ne peut arrêter la marche du monde. » R.Heinlein

Hors ligne

#5 Le 07/02/2011, à 19:42

Vysserk3

Re : [exiv2] - récupération de la chaine retour

Perso j'utilise exiftool pour ça :

var=$(exiftool -DateTimeOriginal -s -s -s -d "%Y%m%d-%Hh%Mm%S" image.jpg)
echo $var

exiftool peut aussi renommer automatiquement selon les tags, il y a plein d'exemples dans le manuel (section RENAMING EXAMPLES dans le man exiftool), mais ce que tu voulais faire, c'est juste récupérer la valeur du nouveau nom, donc il faut le faire en deux temps si tu veux le stocker wink

Hors ligne

#6 Le 07/02/2011, à 20:00

tooney

Re : [exiv2] - récupération de la chaine retour

@cracolinux : merci pour ta réponse, mais je pense que exiv2 permet d'extraire le champ Timestamp directement de l'EXIF sans avoir à passer par manipuler les strings avec sed (avec des options du type "%Y%m..."), comme indiqué par Vysserk3 dans le post après.

@Vysserk3 : je ne connaissais pas exiftool, mais ce que tu m'as dit va beaucoup m'aider wink Je pensais le faire en une ligne de code (renommage + affectation de variable), mais effectivement ça me semble compliqué... Je vais regarder avec exiv2 comment extraire le timestamp au format souhaité pour me rapprocher de la commande que tu m'as donnée avec exiftool.

Je vous ferai un retour sur mes recherches.


Loi de Bonaldi appliquée à Linux : L’expérience prouve que c’est lorsqu’on dit « tu vas voir, linux c’est facile » que se produisent les pannes.

Hors ligne

#7 Le 07/02/2011, à 20:10

cracolinux

Re : [exiv2] - récupération de la chaine retour

tooney a écrit :

@cracolinux : merci pour ta réponse, mais je pense que exiv2 permet d'extraire le champ Timestamp directement de l'EXIF sans avoir à passer par manipuler les strings avec sed (avec des options du type "%Y%m..."), comme indiqué par Vysserk3 dans le post après.

J'ai utilisé sed pour obtenir le même format que celui de ton post #1

J'attends ton script de renommage de photo avec impatience!


Pixup : postez vos images vite et bien - Wificheck : Aidez nous à vous aider

« Ne devenez jamais pessimiste. Un pessimiste a plus souvent raison qu'un optimiste, mais l'optimiste s'amuse plus — et aucun des deux ne peut arrêter la marche du monde. » R.Heinlein

Hors ligne

#8 Le 24/02/2011, à 13:56

tooney

Re : [exiv2] - récupération de la chaine retour

Bon j'ai (enfin) avancé sur mon script wink Finalement pour l'édition de nom de mes fichiers, j'ai repris la méthode de Vysserk3.

Pour info, j'ai fait un peu évoluer mon script. Voici ce que je cherchais à faire :

J'ai une galerie photo php qui tourne sous Coppermine. Ma galerie gère l'affichage des images en format original, et pour l'affichage de la galerie, elle se base sur des miniatures.

Donc mon script devait être capable de faire plusieurs choses :
1) Détecter la présence de nouveaux fichiers .jpg dans mon répertoire "Photos"
2) Renommer ces fichiers .jpg selon le format que j'ai noté au-dessus (avec le timestamp)
3) Créer les miniatures en format 400x400 px (nommé "normal_fichier) et les vignettes au format 128x128 px (nommé "thumb_fichier)

Pour le 1er point, j'ai découvert le paquet iWatch. C'est un démon basé sur les librairies "inotify" qui permet de surveiller un répertoire particulier et de détecter toute modification dans le système de fichier. Dès qu'il y a un changement (création, suppression, modification,...) le démon exécute un script (celui que j'ai écrit en l'occurence).

Pour les points 2 et 3, voici le script que j'ai réalisé. Il reçoit en paramètre le chemin complet du fichier par iWatch, renomme ce fichier et crée les miniatures qui vont bien :

#!/bin/bash

##########################################
## Declaration des variables

# Fichiers et repertoires utiles 
DIR_tmp=/home/tooney/tmp
DIR_Racine=/home/tooney/Films/Photos
Photo=$1
DIR_Photo=$(dirname "$Photo")
FILE_oldPhoto=$(basename "$Photo")
FILE_newPhoto=$FILE_oldPhoto

# Informations EXIF pour les photos
Nom_ini="tooney"
XF_Art="Tooney"
XF_cr="Copyright Tooney, Lily et Velouria"
XF_cmd1="set Exif.Image.Artist Ascii  $XF_Art "
XF_cmd2="set Exif.Image.Copyright Ascii $XF_cr"

##########################################


##########################################
## Fonction de renommage des .jpg selon donnees EXIF

nom_photo() {


FILE_newPhoto=$(exiftool -DateTimeOriginal -s -s -s -d "%Y-%m-%d_%Hh%Mm%S" "$Photo")_$Nom_ini
echo "Traitement en cours : $FILE_newPhoto"
local numero=0
local FILE_boucle="$FILE_newPhoto"

# Si le fichier existe déjà, on rajoute une extension ..."_numero".jpg
while [ -e "$DIR_Photo"/$FILE_boucle.jpg ]
do
    numero=$(expr $numero + 1)
    FILE_boucle=$FILE_newPhoto"_"$numero
done

# Le nom du nouveau fichier photo devient celui genere temporairement
FILE_newPhoto=$FILE_boucle.jpg

}
##########################################


##########################################
## Fonction de traitement des photos (miniatures, ...)

traitement_photo() {

# Deplacement du fichier Photo dans le repertoire temporaire
echo "Deplacement du fichier $Photo dans le repertoire temporaire"
mv "$Photo" "$DIR_tmp/$FILE_newPhoto"

# Rotation de la photo en fonction des données EXIF
exifautotran "$DIR_tmp/$FILE_newPhoto"

# Ajout du Copyright et de l'artiste dans les informations EXIF
exiv2 -f -M"$XF_cmd1" -M"$XF_cmd2" "$DIR_tmp/$FILE_newPhoto"

# Creation des miniatures
mogrify -path "$DIR_tmp/normal/" -resize 400x400 "$DIR_tmp/$FILE_newPhoto"
mv "$DIR_tmp/normal/$FILE_newPhoto" "$DIR_Photo/normal_$FILE_newPhoto"
mogrify -path "$DIR_tmp/thumb/" -resize 128x128 "$DIR_tmp/$FILE_newPhoto"
mv "$DIR_tmp/thumb/$FILE_newPhoto" "$DIR_Photo/thumb_$FILE_newPhoto"

# Deplacement du fichier renomme dans le repertoire d'origine
mv "$DIR_tmp/$FILE_newPhoto" "$DIR_Photo/$FILE_newPhoto"

}
##########################################


##########################################
## Fonction principale

    echo $(date) "=> ## Traitement du fichier $Photo"
    
    # Traitement du fichier seulement s'il contient l'extension .jpg
    if [ ! -d "$Photo" ] && [ $(echo "$FILE_oldPhoto" | grep -c ".jpg") -ne 0 ]
    then 
        echo "$Photo n'est pas un repertoire"
        
        # Traitement du fichier seulement s'il ne s'agit pas d'une miniature
        if [ $(echo "$FILE_oldPhoto" | grep -c "normal_") -eq 0 ] && [ $(echo "$FILE_oldPhoto" | grep -c "thumb_") -eq 0 ]
        then
            echo "Le fichier $Photo n'est pas une miniature"
            
            # Traitement du fichier seulement s
            if [ ! -e "$DIR_Photo/normal_$FILE_oldPhoto" ] & [ ! -e "$DIR_Photo/thumb_$FILE_oldPhoto" ]
            then
                echo "Le fichier $Photo n'a pas encore ete traite"
                echo "## Traitement du fichier $Photo"
                
                echo "L'ancien nom de la photo est $FILE_newPhoto"
                nom_photo
                echo "Le nouveau nom de la photo est $FILE_newPhoto"
                
                traitement_photo
                
            else echo "Le fichier $Photo a deja ete traite"
            fi
        else echo "Le fichier $Photo est une miniature"
        fi
    else echo "$Photo n'est pas un fichier .jpg et ne sera pas traite"
    fi
    
done

##########################################

Le système fonctionne pour l'instant très bien wink Je dois encore un peu affiner la gestion des logs et le traitement des erreurs qui n'est pas encore en place, mais en l'état il marche...

Voilà, si vous avez des suggestions d'amélioration, je suis preneur!


Loi de Bonaldi appliquée à Linux : L’expérience prouve que c’est lorsqu’on dit « tu vas voir, linux c’est facile » que se produisent les pannes.

Hors ligne

#9 Le 24/02/2011, à 14:58

tooney

Re : [exiv2] - récupération de la chaine retour

Ah oui, pour répondre à cracolinux, je n'ai effectivement pas trouvé le moyen d'extraire "uniquement" le timestamp avec exiv2 comme avec exiftool sad
exiv2 a beaucoup d'options, mais au niveau de la consultation, il sort en bloc toutes les informations EXIF sans distinction. Là-dessus, exiftool est plus complet!


Loi de Bonaldi appliquée à Linux : L’expérience prouve que c’est lorsqu’on dit « tu vas voir, linux c’est facile » que se produisent les pannes.

Hors ligne

#10 Le 24/02/2011, à 15:33

FRUiT

Re : [exiv2] - récupération de la chaine retour

Photo=$1

Je suppose que tes photos ne comportent jamais d'espaces, car si c'est le cas........

D'autre part pourquoi écrire :

FILE_boucle=$FILE_newPhoto"_"$numero

plutôt que :

FILE_boucle="${FILE_newPhoto}_$numero"

?


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

#11 Le 24/02/2011, à 15:45

tooney

Re : [exiv2] - récupération de la chaine retour

Merci pour tes remarques FRUiT. Pour être honnête, ce script n'est pas "exactement" celui que j'ai mis en production. J'ai fait des petites modifs justement à cause de la gestion d'espaces, et je crois que $1 en fait partie (car il y a bien des espaces au niveau de mes paths) wink
J'ai posté celui-là car c'est le plus récent que j'avais sous la main, sorry...

Par contre, pour ta 2ème remarque, ne peut-on enlever les accolades et écrire :

FILE_boucle="$FILE_newPhoto_$numero"

?


Loi de Bonaldi appliquée à Linux : L’expérience prouve que c’est lorsqu’on dit « tu vas voir, linux c’est facile » que se produisent les pannes.

Hors ligne

#12 Le 24/02/2011, à 15:49

FRUiT

Re : [exiv2] - récupération de la chaine retour

Si ça marche sans alors oui, les accolades c'est juste pour préciser que le _ ne fait pas partie du non de variable FILE_newPhoto.


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

#13 Le 24/02/2011, à 16:03

FRUiT

Re : [exiv2] - récupération de la chaine retour

Et par exemple là pas besoin de 2 sous-processus :

[ $(echo "$FILE_oldPhoto" | grep -c ".jpg") -ne 0 ]

Exemple :

[ "${FILE_oldPhoto%.jpg}" != "${FILE_oldPhoto}" ]

Pareil ici :

Photo=$1
DIR_Photo=$(dirname "$Photo")
FILE_oldPhoto=$(basename "$Photo")
Photo="$(readlink -e "$1")"
DIR_Photo="${Photo%/*}"
FILE_oldPhoto="${Photo##*/}"

Dernière modification par FRUiT (Le 24/02/2011, à 16:36)


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

#14 Le 24/02/2011, à 17:43

tooney

Re : [exiv2] - récupération de la chaine retour

Bon c'est mon premier script, et je dois avouer que je ne connaissais pas l'usage du symbole %, sympa wink

Très astucieux ta commande

[ "${FILE_oldPhoto%.jpg}" != "${FILE_oldPhoto}" ]

Par contre quel est l'intérêt de "readlink" par rapport au simple "Photo=$1" ?


Loi de Bonaldi appliquée à Linux : L’expérience prouve que c’est lorsqu’on dit « tu vas voir, linux c’est facile » que se produisent les pannes.

Hors ligne

#15 Le 24/02/2011, à 18:14

FRUiT

Re : [exiv2] - récupération de la chaine retour

Déjà ne serait-ce que pour la protection des espaces (quoi que tu aurais pu juste mettre Photo="$1" pour commencer). Ensuite parce que moi, FRUiT, je ne sais pas de quoi est fait $1 (surement envoyé par ton daemon de surveillance), est-ce un chemin complet ? Juste un nom de fichier sans chemin ? Et pour finir parce que dirname renvoie parfois des chemins avec un "." (genre ./dossier/photos) ce qui peut parfois occasionner des problèmes, alors que readlink renvoie toujours le chemin complet en dur (genre /home/truc/dossier/photos).

Dernière modification par FRUiT (Le 24/02/2011, à 18:22)


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 24/02/2011, à 21:04

tooney

Re : [exiv2] - récupération de la chaine retour

FRUiT a écrit :

Ensuite parce que moi, FRUiT, je ne sais pas de quoi est fait $1 (surement envoyé par ton daemon de surveillance), est-ce un chemin complet ?

Cf en post 8 :

Tooney a écrit :

Pour les points 2 et 3, voici le script que j'ai réalisé. Il reçoit en paramètre le chemin complet du fichier par iWatch

tongue

Concernant le $1, c'est bizarre... Je viens de vérifier le véritable script en prod, et j'ai bien mis :

Photo=$1

sans guillemets...
Et pour l'instant, ça n'a jamais posé de problème. Pourtant il y a des espaces dans tous mes répertoires photos !

En tout cas merci pour les tuyaux. Un avis extérieur quand on débute c'est toujours sympa wink

Dernière modification par tooney (Le 24/02/2011, à 21:05)


Loi de Bonaldi appliquée à Linux : L’expérience prouve que c’est lorsqu’on dit « tu vas voir, linux c’est facile » que se produisent les pannes.

Hors ligne

#17 Le 24/02/2011, à 21:41

FRUiT

Re : [exiv2] - récupération de la chaine retour

Ah oui tiens j'ai oublié entre temps hmm

De rian ^^


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

#18 Le 24/02/2011, à 22:12

tooney

Re : [exiv2] - récupération de la chaine retour

Oui je sais, j'ai tendance à être un peu "bavard" par écrit wink


Loi de Bonaldi appliquée à Linux : L’expérience prouve que c’est lorsqu’on dit « tu vas voir, linux c’est facile » que se produisent les pannes.

Hors ligne