【问题标题】:How do I update exif DateTimeOriginal based on filename?如何根据文件名更新 exif DateTimeOriginal?
【发布时间】:2019-01-31 07:45:39
【问题描述】:

我想使用 Google 相册分享 10K 张照片。这些图像是 已扫描,因此它们没有正确的 DateTimeOriginal 以按时间顺序排列。

我需要将 DateTimeOriginal 更新为 YYYY:01:01 00:00:00 以允许我在 Google 相册中整理这些内容以进行共享 并且有一定的秩序感。我的理解是谷歌使用 exif DateTimeOriginal 进行排序。

我的照片命名约定:

1967 年史密斯 G & J 婚礼 - 3.jpg

1962 年史密斯家庭团聚 - 87.jpeg

1990 年史密斯 50 周年 - 16.jpeg

我试过这个:

exiftool "-datetimeoriginal < ${filename;$_=substr($_,0,3)} 01:01 12:00:00" DIR

但收到 BASH“错误替换错误”

我们将不胜感激。

【问题讨论】:

  • shell 将解释双引号字符串中的$ 变量。尝试单引号你传递的代码。

标签: bash perl photo exiftool


【解决方案1】:

可能有更好的方法,但这可行:

#!/bin/bash
for f in *.jpg; do
   year=$(grep -Eo "^\d+" <<< "$f")
   echo File: $f, setting year:$year
   exiftool "-datetimeoriginal=${year}01:01 12:00:00" "$f"
done

调试输出

File: 2013 Family Reunion.jpg, setting year:2013
    1 image files updated
File: 2017 Some wedding.jpg, setting year:2017
    1 image files updated

在临时目录中COPY您的文件试一试!

【讨论】:

  • 是的!为我工作。谢谢。我敢肯定,使用 exiftool 的表达式可能有一种本地方式来做到这一点,但这成功了。
【解决方案2】:

您与原件很接近,但正如@Grinnz 所说,您需要使用单引号。此外,您想要今年的前 4 个数字,但您只获得了 3 个。

那就试试吧:
exiftool '-DateTimeOriginal&lt;${filename;$_=substr($_,0,4)} 01:01 12:00:00' FileOrDir

exiftool 的启动时间是其最大的性能损失,因此您会发现这比循环遍历每个文件要快得多(请参阅exiftool Common Mistake #3)。

此命令创建备份文件。添加-overwrite_original 以禁止创建备份文件。添加-r 以递归到子目录。

【讨论】:

  • 这比上面提供的循环要快得多。使用循环的 10k 图像需要 10 分钟。 exiftool native 花了 1 分钟处理 10k 张图像。谢谢这是最好的答案。我也很欣赏马克的回答!
猜你喜欢
  • 1970-01-01
  • 2021-03-31
  • 2018-01-20
  • 2019-05-20
  • 1970-01-01
  • 2021-10-27
  • 1970-01-01
  • 1970-01-01
  • 2014-06-07
相关资源
最近更新 更多