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 22/07/2019, à 16:34

DonutMan75

[RESOLU] Exiv2 : deux résultats différents ??

(re) bonjour et désolé de vous déranger de nouveau mais...
savez-vous pourquoi deux exécutions d'affilées (moins de 2 secondes d'écart) d'exiv2 ne renvoie pas la même valeur ??

$ exiv2 IMG_5413.JPG 2>/dev/null | grep '^Camera model'
Camera model    : Canon EOS
$ exiv2 IMG_5413.JPG 2>/dev/null | grep '^Camera model'
Fichier binaire (entrée standard) correspondant

En farfouillant sur le net, j'ai trouvé ça :

$ exiv2 IMG_5413.JPG 2>/dev/null | grep --binary-files=text '^Camera model'

Mais je ne comprends pas ce qu'il se passe... hmm

Merci d'avance smile

Donut

Dernière modification par DonutMan75 (Le 24/07/2019, à 13:43)

Hors ligne

#2 Le 22/07/2019, à 22:53

Nuliel

Re : [RESOLU] Exiv2 : deux résultats différents ??

Bonjour,
Pas de problème chez moi. Le fichier n'aurait pas changé de nom? Tu peux garder la sortie d'erreur pour voir quelle erreur ressort?

Dernière modification par Nuliel (Le 22/07/2019, à 22:54)

Hors ligne

#3 Le 23/07/2019, à 07:26

DonutMan75

Re : [RESOLU] Exiv2 : deux résultats différents ??

Hello,
merci pour ton retour !
Non non le fichier ne change pas de nom...
J'ai essayé ta suggestion, mais ça ne change pas grand chose :

$ for f in $(seq 1 30) ; do   exiv2 IMG_5413.JPG | grep '^Camera model' ; done
Camera model    : Canon EOS 500D
(...)
Camera model    : Canon EOS 500D
Fichier binaire (entrée standard) correspondant
Camera model    : Canon EOS 500D
(...)
Camera model    : Canon EOS 500D

J'ai tronqué les messages car sur les 30 affichages ici, seul un seul est problématique.. Souvent les trente retours sont identiques et corrects, des fois c'est un peu plus d'une erreur qui est générée...

Très curieusement, si j'essaie d'enlever toutes les lignes "attendue", (i.e. comportant un ':'), j'obtient cela :

$ for f in $(seq 1 30) ; do exiv2 IMG_5413.JPG | grep -v ':' ; done
Fichier binaire (entrée standard) correspondant
(...)
Fichier binaire (entrée standard) correspondant

(encore une fois, c'est tronqué : ici toutes les lignes sont identiques)

Voici le retour de exiv2 sans le grep :

$ exiv2 IMG_5413.JPG
File name       : IMG_5413.JPG
File size       : 5705314 Bytes
MIME type       : image/jpeg
Image size      : 4752 x 3168
Camera make     : Canon
Camera model    : Canon EOS
Image timestamp : 2019:07:22 11:46:58
Image number    : 
Exposure time   : 1/160 s
Aperture        : F6.3
Exposure bias   : 0 EV
Flash           : No, compulsory
Flash bias      : 0 EV
Focal length    : 170.0 mm
Subject distance: 00.97 m1.14 m
ISO speed       : 3200
Exposure mode   : Aperture priority
Metering mode   : Multi-segment
Macro mode      : Off
Image quality   : Fine
Exif Resolution : 4752 x 3168
White balance   : Auto
Thumbnail       : image/jpeg, 10765 Bytes
Copyright       : 
Exif comment    : 

Pour terminer, j'ai également testé cela :

$ exiv2 IMG_5413.JPG > ~/t1
$ for f in $(seq 1 100) ; do exiv2 IMG_5413.JPG > ~/t2; diff ~/t1 ~/t2 ; done
$

Si je comprends bien l'instruction "--binary-files=text" indique à grep de traiter les fichiers binaires comme du texte ? Mais alors pourquoi dans *certains cas* la sortie d'exiv2 ne renvoie pas la même chose ??

D.

Hors ligne

#4 Le 23/07/2019, à 07:33

DonutMan75

Re : [RESOLU] Exiv2 : deux résultats différents ??

Oh oh,
je viens d'avancer : le problème est présent dans les fichiers t1 et t2 que j'ai crées précédemment.

$ grep "Camera" t1
Fichier binaire t1 correspondant
$ grep "Camera" t2
Fichier binaire t2 correspondant
$ od -a t1
0000000   F   i   l   e  sp   n   a   m   e  sp  sp  sp  sp  sp  sp  sp
0000020   :  sp   I   M   G   _   5   4   1   3   .   J   P   G  nl   F
0000040   i   l   e  sp   s   i   z   e  sp  sp  sp  sp  sp  sp  sp   :
0000060  sp   5   7   0   5   3   1   4  sp   B   y   t   e   s  nl   M
0000100   I   M   E  sp   t   y   p   e  sp  sp  sp  sp  sp  sp  sp   :
0000120  sp   i   m   a   g   e   /   j   p   e   g  nl   I   m   a   g
0000140   e  sp   s   i   z   e  sp  sp  sp  sp  sp  sp   :  sp   4   7
0000160   5   2  sp   x  sp   3   1   6   8  nl   C   a   m   e   r   a
0000200  sp   m   a   k   e  sp  sp  sp  sp  sp   :  sp   C   a   n   o
0000220   n  nl   C   a   m   e   r   a  sp   m   o   d   e   l  sp  sp
0000240  sp  sp   :  sp   C   a   n   o   n  sp   E   O   S  sp   5   0
0000260   0   D  nl   I   m   a   g   e  sp   t   i   m   e   s   t   a
0000300   m   p  sp   :  sp   2   0   1   9   :   0   7   :   2   2  sp
0000320   1   1   :   4   6   :   5   8  nl   I   m   a   g   e  sp   n
0000340   u   m   b   e   r  sp  sp  sp  sp   :  sp  nl   E   x   p   o
0000360   s   u   r   e  sp   t   i   m   e  sp  sp  sp   :  sp   1   /
0000400   1   6   0  sp   s  nl   A   p   e   r   t   u   r   e  sp  sp
0000420  sp  sp  sp  sp  sp  sp   :  sp   F   6   .   3  nl   E   x   p
0000440   o   s   u   r   e  sp   b   i   a   s  sp  sp  sp   :  sp   0
0000460  sp   E   V  nl   F   l   a   s   h  sp  sp  sp  sp  sp  sp  sp
0000500  sp  sp  sp  sp   :  sp   N   o   ,  sp   c   o   m   p   u   l
0000520   s   o   r   y  nl   F   l   a   s   h  sp   b   i   a   s  sp
0000540  sp  sp  sp  sp  sp   :  sp   0  sp   E   V  nl   F   o   c   a
0000560   l  sp   l   e   n   g   t   h  sp  sp  sp  sp   :  sp   1   7
0000600   0   .   0  sp   m   m  nl   S   u   b   j   e   c   t  sp   d
0000620   i   s   t   a   n   c   e   :  sp   0   0   .   9   7  sp   m
0000640   1   .   1   4  sp   m  nl   I   S   O  sp   s   p   e   e   d
0000660  sp  sp  sp  sp  sp  sp  sp   :  sp   3   2   0   0  nl   E   x
0000700   p   o   s   u   r   e  sp   m   o   d   e  sp  sp  sp   :  sp
0000720   A   p   e   r   t   u   r   e  sp   p   r   i   o   r   i   t
0000740   y  nl   M   e   t   e   r   i   n   g  sp   m   o   d   e  sp
0000760  sp  sp   :  sp   M   u   l   t   i   -   s   e   g   m   e   n
0001000   t  nl   M   a   c   r   o  sp   m   o   d   e  sp  sp  sp  sp
0001020  sp  sp   :  sp   O   f   f  nl   I   m   a   g   e  sp   q   u
0001040   a   l   i   t   y  sp  sp  sp   :  sp   F   i   n   e  nl   E
0001060   x   i   f  sp   R   e   s   o   l   u   t   i   o   n  sp   :
0001100  sp   4   7   5   2  sp   x  sp   3   1   6   8  nl   W   h   i
0001120   t   e  sp   b   a   l   a   n   c   e  sp  sp  sp   :  sp   A
0001140   u   t   o  nl   T   h   u   m   b   n   a   i   l  sp  sp  sp
0001160  sp  sp  sp  sp   :  sp   i   m   a   g   e   /   j   p   e   g
0001200   ,  sp   1   0   7   6   5  sp   B   y   t   e   s  nl   C   o
0001220   p   y   r   i   g   h   t  sp  sp  sp  sp  sp  sp  sp   :  sp
0001240  nl   E   x   i   f  sp   c   o   m   m   e   n   t  sp  sp  sp
0001260  sp   :  sp nul nul nul nul nul nul nul nul nul nul nul nul nul
0001300 nul nul nul nul nul nul nul nul nul nul nul nul nul nul nul nul
*
0001660 nul nul nul  nl  nl
0001665

Je suppose que ce sont ces "nul" tout à la fin du fichier qui posent problème.
Démonstration :

$ cat t1 | grep Camera
Fichier binaire (entrée standard) correspondant
$ head t1 | grep Camera
Camera make     : Canon
Camera model    : Canon EOS

Et également :

$ grep '^Camera model' ~/t1
Fichier binaire /home/donut/t1 correspondant
$ tr -d '\000' < ~/t1 | grep '^Camera model'
Camera model    : Canon EOS

Bon mais je ne comprends toujours pas pourquoi des fois ça marche et des fois ça marche pas....

D.

Dernière modification par DonutMan75 (Le 23/07/2019, à 07:39)

Hors ligne

#5 Le 23/07/2019, à 10:48

kamaris

Re : [RESOLU] Exiv2 : deux résultats différents ??

C'est peut-être une question de vitesse d'écriture de exiv2 dans le pipe : selon que grep a eu le temps de faire ou non son test de reconnaissance de binaires avant que exiv2 ait fini d'écrire, car grep est lancé en parallèle de exiv2 dans un process distinct.
Tandis que si tu lui passes le fichier directement par un « grep '^Camera model' ~/t1 », le problème ne se pose pas car il fait toujours le test sur le fichier entier.

EDIT : il est possible de réduire le test à

cat <(echo a) <(echo -ne "\x00") | grep a

pour obtenir par exemple :

$ cat <(echo a) <(echo -ne "\x00") | grep a
a
$ cat <(echo a) <(echo -ne "\x00") | grep a
Fichier binaire (entrée standard) correspondant
$ cat <(echo a) <(echo -ne "\x00") | grep a
a
$ cat <(echo a) <(echo -ne "\x00") | grep a
a
$ cat <(echo a) <(echo -ne "\x00") | grep a
a
$ cat <(echo a) <(echo -ne "\x00") | grep a
a
$ cat <(echo a) <(echo -ne "\x00") | grep a
a
$ cat <(echo a) <(echo -ne "\x00") | grep a
a
$ cat <(echo a) <(echo -ne "\x00") | grep a
a
$ cat <(echo a) <(echo -ne "\x00") | grep a
a
$ cat <(echo a) <(echo -ne "\x00") | grep a
Fichier binaire (entrée standard) correspondant
$ cat <(for ((i=1;i<2;i++)); do echo a; done) <(echo -ne "\x00") | grep a
a
$ 

Dernière modification par kamaris (Le 23/07/2019, à 13:18)

Hors ligne

#6 Le 24/07/2019, à 08:39

DonutMan75

Re : [RESOLU] Exiv2 : deux résultats différents ??

Salut Kamaris,
merci pour tes éclaircissements,
j'ai fait des tests de mon côté et j'observe le même genre de comportement que toi !
Edifiant !!
Je ne m'étais jamais posé la question de la vitesse d'écriture dans le pipe..

Nénamoins :

Kamaris a écrit :

Tandis que si tu lui passes le fichier directement par un « grep '^Camera model' ~/t1 », le problème ne se pose pas

je ne suis pas d'accord, le problème semble bien présent car, comme je l'indiquais dans mon post précédent :

$ grep '^Camera model' ~/t1
Fichier binaire /home/donut/t1 correspondant
$ tr -d '\000' < ~/t1 | grep '^Camera model'
Camera model    : Canon EOS

Ce qui me reste à éclaircir :
1) Pourquoi le fichier t1 est-il considéré comme binaire ? C'est confirmé d'ailleurs par un file

$ file t1
t1: data

Alors certes, il y a bien plusieurs "\x00" dans le fichier mais d'après mes connaissances, c'est juste un caractère pour marquer la fin d'une chaîne de caractère. Normalement il ne devrait y en avoir qu'un seul à la fin du fichier. Ici c'est un peu exotique car il y en a plein (question d'alignement ?). Est-ce la raison pour laquelle file considère qu'on a du coup affaire à un fichier binaire et non ASCII ??

2) Pourquoi des fois ma commande "exiv2 ... | grep" machin fonctionne par moment ?? Si la vitesse d'écriture dans le pipe était la cause principale, on ne devrait plus l'observer quand on fait une sortie dans un fichier. Or ce n'est pas le cas...

Merci en tout cas pour vos pistes de réflexion !!
Bonne journée à tous smile

Donut

Hors ligne

#7 Le 24/07/2019, à 10:06

ar barzh paour

Re : [RESOLU] Exiv2 : deux résultats différents ??

ça ressemble à un problème que j'avais eu lorsque j'ai développé une petite application utilisant exiv2

mais c'était en 2012

https://forum.ubuntu-fr.org/viewtopic.php?id=1030421


PC          : B760M DS3H DDR4,  12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 22.04, 22.04, 23.04
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 23.04 ( en voyage )
Portable2 : T5750  @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )

Hors ligne

#8 Le 24/07/2019, à 11:52

kamaris

Re : [RESOLU] Exiv2 : deux résultats différents ??

DonutMan75 a écrit :

Nénamoins :

Kamaris a écrit :

Tandis que si tu lui passes le fichier directement par un « grep '^Camera model' ~/t1 », le problème ne se pose pas

je ne suis pas d'accord, le problème semble bien présent car, comme je l'indiquais dans mon post précédent :

$ grep '^Camera model' ~/t1
Fichier binaire /home/donut/t1 correspondant
$ tr -d '\000' < ~/t1 | grep '^Camera model'
Camera model    : Canon EOS

Quand je disais « le problème ne se pose pas », je voulais dire « le problème [du comportement aléatoire] ne se pose pas » : quand tu passes directement le fichier à grep, il te répond systématiquement qu'il est binaire, car il a le temps de repérer les caractères nuls avant de lancer sa recherche des occurrences du pattern « ^Camera model ». Mais ce ne serait plus forcément vrai si le fichier était assez gros avec un caractère nul seulement tout à la fin et une occurrence du pattern au début.

DonutMan75 a écrit :

Ce qui me reste à éclaircir :
1) Pourquoi le fichier t1 est-il considéré comme binaire ?

Ça, la réponse est dans man grep : « Non-text  bytes  indicate  binary  data;  these  are either output bytes that are improperly encoded for the current locale, or null input bytes when the -z option is not given. » Donc c'est comme ça, c'est son critère.

DonutMan75 a écrit :

Pourquoi des fois ma commande "exiv2 ... | grep" machin fonctionne par moment ?? Si la vitesse d'écriture dans le pipe était la cause principale, on ne devrait plus l'observer quand on fait une sortie dans un fichier. Or ce n'est pas le cas...

Quand je dis « vitesse d'écriture dans le pipe » c'est peut-être bancal, mais la clef c'est que les process d'une commande où intervient un pipe tournent en parallèle, et qu'en conséquence il n'est pas rare d'observer des comportements aléatoires comme ça en bash.

Dernière modification par kamaris (Le 24/07/2019, à 11:54)

Hors ligne

#9 Le 24/07/2019, à 12:06

kamaris

Re : [RESOLU] Exiv2 : deux résultats différents ??

@ar barzh paour : oui, ça me semble être exactement le même problème.

Quant au résultat donné par la commande file, ici ou dans l'autre sujet cité, il correspond lui aussi au test indiqué dans la page de manuel, en notant bien que ça n'est pas le même test que pour grep : « The type printed will usually contain one of the words text (the file contains only printing characters and a few common control characters and is probably safe to read on an ASCII terminal), executable (the file contains the result of compiling a program in a form understandable to some UNIX kernel or another), or data meaning anything else (data is usually “binary” or non-printable). »

Hors ligne

#10 Le 24/07/2019, à 13:42

DonutMan75

Re : [RESOLU] Exiv2 : deux résultats différents ??

Super, un énorme merci à vous tous (et particulièrement kamaris) pour vos contributions !
Tout est clair maintenant !!

Passez une bonne après-midi... et hydratez vous tongue (38°C de par chez moi...)

D.

Hors ligne