![使用 EXIFTool 从文件名添加 EXIF 数据](https://linux22.com/image/36313/%E4%BD%BF%E7%94%A8%20EXIFTool%20%E4%BB%8E%E6%96%87%E4%BB%B6%E5%90%8D%E6%B7%BB%E5%8A%A0%20EXIF%20%E6%95%B0%E6%8D%AE.png)
有一组照片的文件名中带有时间戳,如下所示:
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 tags
和FileName 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}
用来扩展为 的值。tag
perl-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
.