exiv2 通过管道传输到 grep - 随机不一致行为

exiv2 通过管道传输到 grep - 随机不一致行为

对于一堆jpg照片,我有这个(简化的)脚本能够提取照片拍摄时的原始日期(如果与 0000:00:00 不同,则与本例无关)

for f in *.jpg;
do 
    echo -n $f "  >>  " ;
    /usr/bin/exiv2 -P E  pr $f  | grep 'Exif.Photo.DateTimeOriginal';
done

但是 from 的管道exiv2有时grep会检索照片元数据中存在的信息,有时则不会。文件列表测试集为:

$ ls
sany0070.jpg  sany0071.jpg  sany0072.jpg  sany0073.jpg  sany0074.jpg

我从中得到的是不一致的结果,例如:

$ for f in *.jpg; do echo -n $f "  >>  " ; /usr/bin/exiv2 -P E  pr $f  | grep 'Exif.Photo.DateTimeOriginal'; done
sany0070.jpg   >>  Exif.Photo.DateTimeOriginal                  Ascii      20  0000:00:00 00:00:00
sany0071.jpg   >>  Exif.Photo.DateTimeOriginal                  Ascii      20  0000:00:00 00:00:00
sany0072.jpg   >>  Exif.Photo.DateTimeOriginal                  Ascii      20  0000:00:00 00:00:00
sany0073.jpg   >>  Binary file (standard input) matches
sany0074.jpg   >>  Binary file (standard input) matches

第二次(脚本能够按预期 grep):

$ for f in *.jpg; do echo -n $f "  >>  " ; /usr/bin/exiv2 -P E  pr $f  | grep 'Exif.Photo.DateTimeOriginal'; done
sany0070.jpg   >>  Exif.Photo.DateTimeOriginal                  Ascii      20  0000:00:00 00:00:00
sany0071.jpg   >>  Exif.Photo.DateTimeOriginal                  Ascii      20  0000:00:00 00:00:00
sany0072.jpg   >>  Exif.Photo.DateTimeOriginal                  Ascii      20  0000:00:00 00:00:00
sany0073.jpg   >>  Exif.Photo.DateTimeOriginal                  Ascii      20  0000:00:00 00:00:00
sany0074.jpg   >>  Exif.Photo.DateTimeOriginal                  Ascii      20  0000:00:00 00:00:00

第三次(无法 grep 所询问的信息,尽管它与第一次尝试不同:

$ for f in *.jpg; do echo -n $f "  >>  " ; /usr/bin/exiv2 -P E  pr $f  | grep 'Exif.Photo.DateTimeOriginal'; done
sany0070.jpg   >>  Exif.Photo.DateTimeOriginal                  Ascii      20  0000:00:00 00:00:00
sany0071.jpg   >>  Exif.Photo.DateTimeOriginal                  Ascii      20  0000:00:00 00:00:00
sany0072.jpg   >>  Binary file (standard input) matches
sany0073.jpg   >>  Exif.Photo.DateTimeOriginal                  Ascii      20  0000:00:00 00:00:00
sany0074.jpg   >>  Exif.Photo.DateTimeOriginal                  Ascii      20  0000:00:00 00:00:00

等等。

我正在运行 Slackware64 14.2 Linux:

$ grep -V
grep (GNU grep) 2.25

$ exiv2 --version
exiv2 0.25 001900 (64 bit build)

我想知道为什么会发生这种情况以及如何处理。

编辑:这组文件发生了这种情况(示例中的五个文件作为原始目录中 76 个文件的样本),但在我应用它的数十个目录中的数百个其他文件上没有发生任何问题。

答案1

路易斯,你的最后一次编辑解释了这一切。不是你的代码被破坏了;而是你的代码被破坏了。它是某些特定 jpeg 文件的元数据。我不知道如何解决这个问题,但至少我可以告诉你,你需要在 jpeg 文件本身中寻找答案。我认为 Gimp 和 ImageMagick 会让你修复这些问题,但你必须阅读手册才能了解如何使用这些应用程序更改元数据。希望有帮助。

相关内容