使用 EXIFTool 从文件名添加 EXIF 数据

使用 EXIFTool 从文件名添加 EXIF 数据

有一组照片的文件名中带有时间戳,如下所示:

Photo on 3-09-12 at 9.24 PM #2.jpg

Photo on 3-09-12 at 9.24 PM #1.jpg

Photo on 3-09-12 at 8.23 PM.jpg

ETC。

(“3-09-12”表示“2012 年 9 月 3 日”或 DD-MM-YY)

但这些照片根本没有 EXIF 数据。在将它们导入到更大的集合之前,您将如何将此信息通过管道传输exiftool并告诉它添加新的时间戳作为 EXIF 数据(全部来自照片的文件名)?

更新:(现在的第 1 部分)我关于用 DD-MM-YY 和 12 小时时间解析文件名的问题已经得到了 @Stephane 的友好回答。但我发现同一批照片包含的文件名有一个我错过的变体。我希望添加“Pt”更有意义。 2'而不是开始一个全新的问题。

简而言之:

我怎样才能改变@Stephane 的精彩答案——

exiftool '-CreateDate<${FileName;use Date::Manip;
                      Date_Init("DateFormat=non-US");
                      /on (.*?at.*?[AP]M)/;$_=$1;
                      y/./:/;$_=UnixDate($_,"%Y-%m-%d %T")
                      }' ./*on\ *at*[PA]M*.jpg

-- 这样它就可以使用下面的文件名格式,这与问题的第一部分略有不同,因为它使用 YYYY-MM-DD 和 24 小时时间:

Photo on 2010-09-15 at 18.44 #4.jpg

Photo on 2010-09-15 at 18.44 #3.jpg

Photo on 2010-09-15 at 18.44.jpg

更多解释:

尝试编辑Date::Manip斯蒂芬剧本的部分似乎表明我对其中最重要部分的情况一无所知。

我尝试省略该Date_Init行,因为我们回到了 ISO 式的全年日期格式,然后

/on (.*?at.*?)/;$_=$1;
y/./:/;$_=UnixDate($_,"%Y-%m-%d %T")
' ./*on\ *at*.jpg

exiftool正在给我no writeable tagsFileName not defined。说明位于http://search.cpan.org/~sbeck/Date-Manip-5.56/lib/Date/Manip.pod似乎对理解这些时期发生的事情没有帮助(至少对我来说),行开头的“y”、分号等,而且它们相当无法用谷歌搜索:S

答案1

尝试:

exiftool '-CreateDate<${FileName;use Date::Manip;
                      Date_Init("DateFormat=non-US");
                      /on (.*at.*?)(?: #\d+)?\.jpg$/;$_=$1;
                      y/./:/;$_=UnixDate($_,"%Y-%m-%d %T")
                      }' ./*on\ *at*.jpg

(您可能需要安装该Date::Manip perl模块)。

设置-Tag<value相应的标签。经 处理后,可以${tag;perl-code}用来扩展为 的值。tagperl-code

这里,计划使用 的Date::Manip函数UnixDate来解析文件名中的日期并将其转换为标签CreateDate( 2011-04-15 21:38:00) 可接受的格式。

Date::Manip理解许多常见的日期格式。例如,它可以理解3-09-12 at 9:24 PM(尽管您必须告诉它是美国还是非美国惯例,其中日期或月份在前)和2010-09-15 at 18.44(注意:而不是.)。

所以我们要做的就是从文件名中提取该部分,将其转换.:并将其传递给UnixDate.

相关内容