IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Modifier récursivement les données EXIF de certains fichiers


Sujet :

Shell et commandes GNU

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 14
    Points : 5
    Points
    5
    Par défaut Modifier récursivement les données EXIF de certains fichiers
    Bonjour,

    Certains de mes fichiers photos (pas tous) on une date de création erronées.
    Chanceux que je suis, il s'agit d'une erreur de 4 ans exactement.

    J'ai trouvé la commande exiftool qui va me permettre de réajuster tout ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    exiftool "-MediaCreateDate+=4:0:0 0:0:0" P10*.*
    Sur un fichier, ça marche parfaitement.

    Mon soucis est plus lié à un problème de scrit shell (je suis sous Linux avec bash).

    En effet, mes photos sont dans une enorme arborescence. Je peux facilement les trouver via le find suivant :
    Seulement cette commande me retourne aussi les photos qui commencent par P10* qui ont une date EXIF correcte !

    Je dois donc trouver un moyen de faire le tri sur ces photos, en checkant uniquement celle qui ont dans leur tag "MediaCreateDate" l'année 2009.
    Sur un seul fichier, la commande suivante fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    exiftool -s P1060319.JPG |grep MediaCreateDate|grep 2009
    Ma question est la suivante : comment faire pour réaliser les étapes suivantes dans cette ordre là :
    1. rechercher récursivement tous les fichiers du répertoire courant qui s'appellent P10*.*
    2. parmi ces résultats, ne garder que les fichiers qui ont la chaine "2009" dans le tag EXIF "MediaCreateDate"
    3. sur chacun de ces résultats, appliquer la commande : exiftool "-MediaCreateDate+=4:0:0 0:0:0" $i


    Merci pour votre aide

  2. #2
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 452
    Points
    19 452
    Par défaut
    Bonjour.

    Quelque chose comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -name P10*.*|xargs -I{} bash -c "exiftool -s {}|egrep -i \"MediaCreateDate.*2009\" >/dev/null && echo {}"|xargs exiftool "-MediaCreateDate+=4:0:0 0:0:0"
    Peut être pas utile d'utiliser find si les images se trouvent toutes dans le répertoire courant (à la racine de ce répertoire courant) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for file in P10*; do exiftool -s "$file"|egrep -i "MediaCreateDate.*2009" >/dev/null && exiftool "-MediaCreateDate+=4:0:0 0:0:0" "$file"; done
    ?

    Idriss

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    Merci ok.Idriss, la première solution marche nickel !
    Je n'ai pas testé la seconde car les dossiers sont imbriqués et j'ai besoin du find pour cela.

  4. #4
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 452
    Points
    19 452
    Par défaut
    Super !

    Citation Envoyé par Spheerys Voir le message
    Je n'ai pas testé la seconde car les dossiers sont imbriqués et j'ai besoin du find pour cela.
    Oui dans ce cas, la première est plus adaptée en effet.

    Idriss

  5. #5
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 452
    Points
    19 452
    Par défaut
    En relisant ma commande, je me rend compte qu'on peux encore simplifier (même si j'imagine que c'était du one shot et que ça y-est ton soucis est résolu).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -name P10*.*|xargs -I{} bash -c "exiftool -s {}|egrep -i \"MediaCreateDate.*2009\" >/dev/null && exiftool \"-MediaCreateDate+=4:0:0 0:0:0\" {}"
    D'ailleurs, il est encore possible de simplifier avec l'option -exec de find et se passer complétement de xargs...

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    j'ai été un peu vite en besogne !
    J'avais fait un test vite fait sur une arborescence bidon et ça a marché.

    Sauf qu'en réalité, j'ai des répertoires avec des espaces et des accents.
    Et ça, ça bloque la commande magique !

    J'ai essayé de voir si je pouvais m'en sortir seul, mais ça semble moins trivial que je ne l'imaginais !

    Un nouveau coup de pouce me sera utile

  7. #7
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 452
    Points
    19 452
    Par défaut
    Bonsoir.

    Ah oui effectivement, ceci devrait fonctionner :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -name "P10*.*"|xargs -I{} bash -c "exiftool -s \"{}\"|egrep -i \"MediaCreateDate.*2009\" >/dev/null && exiftool \"-MediaCreateDate+=4:0:0 0:0:0\" \"{}\""
    Il faut encadrer l'expression l'argument de l'option -name par des doubles quotes pour que ce ne soit pas bash qui face l'expansion de la wildcard "*".
    J'ai aussi encadré le nom du fichier en argument à exiftool pour pas qu'il le considère comme deux arguments.

    Idriss

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    Hummm y a un truc qui coince.
    La commande se lance, mouline quelques secondes, mais n'effectue aucune action.

  9. #9
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 842
    Points
    7 842
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -type f -name "P10*.*" -exec bash -c 'for i do [ "$(exiftool "$i" -mediacreatedate | grep 2009:)" ] && exiftool -mediacreatedate+="4:0:0 0:0:0" "$i" ; done' bash {} +

  10. #10
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 452
    Points
    19 452
    Par défaut
    Citation Envoyé par Spheerys Voir le message
    Hummm y a un truc qui coince.
    La commande se lance, mouline quelques secondes, mais n'effectue aucune action.
    N'ayant pas l'outil exiftool a disposition je ne peux pas tester correctement, néammoins tu peux essayer de debbuger par exemple avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -name "P10*.*"|xargs -I{} bash -c "exiftool -s \"{}\"|egrep -i \"MediaCreateDate.*2009\" >/dev/null && echo exiftool \"-MediaCreateDate+=4:0:0 0:0:0\" \"{}\""
    Voir si ça renvoie bien une série "exiftools" de commandes sur des fichiers correspondants à ton motif... si c'est pas le cas remonter au egrep et analyser ce qu'il renvoie et ainsi de suite...

    Citation Envoyé par jlliagre Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -type f -name "P10*.*" -exec bash -c 'for i do [ "$(exiftool "$i" -mediacreatedate | grep 2009:)" ] && exiftool -mediacreatedate+="4:0:0 0:0:0" "$i" ; done' bash {} +
    for i do ? Ne manquerait-il pas quelque chose ?


    Idriss

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    Bon en fait je pense que ça a marché.
    J'ai été troublé par le fait qu'il ne m'affiche pas, comme s'était le cas auparavant, une petite phrase du genre "32 fichiers modifiés"
    Là j'ai regardé quelques fichiers au hasard qui n'étaient pas bon, et la date semble à jour.
    Je confirme ça demain

  12. #12
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 452
    Points
    19 452
    Par défaut
    Oui je confirme que ma commande n'affiche rien normalement, elle fait c'est tout
    Si tu veux en plus afficher les fichiers traités, c'est pas compliqué :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -name "P10*.*"|xargs -I{} bash -c "exiftool -s \"{}\"|egrep -i \"MediaCreateDate.*2009\" >/dev/null && exiftool \"-MediaCreateDate+=4:0:0 0:0:0\" \"{}\" && echo \"{} modifié...\""
    D'ailleurs avec tout ces quotes, il est temps d'alléger un peu la commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -name "P10*.*"|xargs -I{} bash -c 'exiftool -s "{}"|egrep -i "MediaCreateDate.*2009" >/dev/null && exiftool "-MediaCreateDate+=4:0:0 0:0:0" "{}" && echo "{} modifié..."'

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    Quelque soit la version de la commande utilisée, cela fonctionne, mais à un moment donné j'ai cette erreur :
    xargs: guillemets simple non appairés ; par défaut les guillemets sont particuliers à xargs à moins d'utiliser l'option -0

  14. #14
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 452
    Points
    19 452
    Par défaut
    Bizarre pas eu cette erreur ... Avais-tu eu ce message auparavant ? Peut être que tu as inséré ou oublié un caractère.
    Quel est le nom du fichier traité lorsque survient cette erreur ?

  15. #15
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 452
    Points
    19 452
    Par défaut
    Hum je pense avoir reproduit avec un fichier dont le nom contenait un simple quote :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ ll | egrep P
    -rwxr-xr-x  1 XXXX XXXX 104056 2014-06-10 12:57 P10EEEE.jpg
    -rwxr-xr-x  1 XXXX XXXX 104056 2014-06-10 21:59 P1\'0 EEE.jpg #j'ai rajouté le \ pour la coloration syntaxique des balises CODE
    $ find . -name "P*jpg"|xargs -I{} bash -c 'exiftool -s "{}"|egrep -i ".*2014" >/dev/null && echo "fichier = {}"'
    xargs: unmatched single quote; by default quotes are special to xargs unless you use the -0 option
    fichier = ./P10EEEE.jpg
    Est-ce que tu as des fichiers nommés avec des simple quotes ?

  16. #16
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 302
    Points : 12 798
    Points
    12 798
    Par défaut
    Bonjour,

    Je n'ai pas non plus exiftools, mais ceci devrait fonctionner (pas testé):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -name "P10*.*" -exec bash -c 'exiftool -s "{}"|egrep -iq "MediaCreateDate.*2009"' \; -exec exiftool "-MediaCreateDate+=4:0:0 0:0:0" "{}" \;

  17. #17
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 842
    Points
    7 842
    Par défaut
    Citation Envoyé par ok.Idriss Voir le message

    for i do ? Ne manquerait-il pas quelque chose ?
    Non, il ne manque rien. Bien que peu utilisée, c'est une syntaxe standard strictement équivalente à:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    man bash
    ...
           for name [ [ in [ word ... ] ] ; ] do list ; done
    PS: J'ai testé la commande que j'ai posté et elle m'a bien modifié les fichiers datés de 2009. La seule différence est que j'ai remplacé "MediaCreateDate" pas "createdate" car je n'avais pas de tag EXIF MediaCreateDate dans mes fichiers de test.

  18. #18
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 452
    Points
    19 452
    Par défaut
    Ah merci de l'info

  19. #19
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par ok.Idriss Voir le message

    Est-ce que tu as des fichiers nommés avec des simple quotes ?

    Je pense que le problème doit survenir quand un nom de répertoire contient une apostrophe '
    L'erreur ne m'indique pas quel répertoire est en cause

  20. #20
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 452
    Points
    19 452
    Par défaut
    Re

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -name "P10*.*" -print0|xargs -0 -I{} bash -c 'exiftool -s "{}"|egrep -i "MediaCreateDate.*2009" >/dev/null && exiftool "-MediaCreateDate+=4:0:0 0:0:0" "{}" && echo "{} modifié..."'
    Bon juste histoire de corriger cette version, après encore une fois, utiliser -exec à la place de xargs c'est mieux et le problème des simples quotes ne se produit pas...
    C'est ce que font les solutions de jlliagre et de disedorgue. Je recommande celle de disedorgue qui semble être la plus simple. Je l'adapte un peu pour afficher le fichier modifié :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -name "P10*.*" -exec bash -c 'exiftool -s "{}"|egrep -iq "MediaCreateDate.*2009"' \; -exec exiftool "-MediaCreateDate+=4:0:0 0:0:0" "{}" -exec "Fichier modifié = {}" \;
    Idriss

Discussions similaires

  1. Modifier les données exif
    Par fab039 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 24/06/2008, 17h35
  2. Modifier les données exif
    Par fab039 dans le forum ASP
    Réponses: 0
    Dernier message: 24/06/2008, 15h34
  3. Réponses: 3
    Dernier message: 04/04/2008, 07h03
  4. Réponses: 3
    Dernier message: 23/09/2006, 15h19
  5. Réuperer les données à partir d'un fichier de log
    Par Oberown dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 31/10/2005, 10h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo