如何使用ExifTool从文件名设置文件的DateTimeOriginal?

3

我有一个包含许多图像文件的目录,这些文件没有设置它们的DateTimeOriginal元数据,但是在文件名中以YYYMMDD的格式指定了日期,例如20120524_091536.mp4

我想使用exiftool将这些文件移动到以年为名称的文件夹中,然后再创建以月份为子文件夹(稍后还要使用文件名中的日期设置其DateTimeOriginal)

类似于这样:

exiftool -d "%Y-%m-%d" "-testname<D:\Pictures\${filename#;DateFmt('%Y')}\${filename#;DateFmt('%m')}\$FileName" "D:\Pictures\2012-05-24" -r 

但是这会引发一个“Error converting date/time for 'filename'”错误。这很有道理,我该如何告诉它仅将文件名的前8个数字格式化为日期?
我想使用ExifTool的原因是,实际上我将进一步完善此语句,只对没有设置“datetimeoriginal”元数据的文件执行此操作,以便exiftool可以将其过滤掉...类似于以下限定符:
exiftool '-datetimeoriginal<filemodifydate' -if '(not $datetimeoriginal or ($datetimeoriginal eq "0000:00:00 00:00:00")) and ($filetype eq "JPEG")'

但是,我需要将datetimeoriginal设置为从文件名格式化的日期,而不是文件修改日期。

1个回答

2
要从文件名设置DateTimeOriginal,命令非常简单
exiftool "-DateTimeOriginal<Filename" -if "not $datetimeoriginal or ($datetimeoriginal eq '0000:00:00 00:00:00')" -ext jpg DIR。这是基于Exiftool FAQ#5的,其中说“在写入时,ExifTool对输入日期/时间值的实际格式非常灵活,并且将尝试将任何值重新格式化为标准格式,除非使用-n选项。可以使用任何分隔符(或者实际上根本不使用)。找到值中的前4个连续数字解释为年份,接下来的2个数字是月份,依此类推。”我删除了您示例中的$filetype eq“ JPEG”部分,并用-ext选项替换它,因为检查Filetype并不是限制处理的文件的好方法,因为exiftool仍会处理并提取每个文件的所有元数据以执行检查。请注意,如您示例所示,.mp4文件类型无法保存DateTimeOriginal标记。相反,您必须使用类似CreateDate的东西。还要注意,exiftool对视频文件的写入能力有限。因为文件名不是时间戳类型标记,所以您无法使用-d(dateformat)选项,正如您发现的那样。相反,您将必须使用高级格式化功能来拆分文件名。给定第一个示例文件名,您的命令将是:exiftool "-testname<D:\Pictures\${filename;s/^(\d{4}).*/$1/}\${filename;s/^\d{4}(\d\d).*/$1/}\%F" "D:\Pictures\2012-05-24" -r

由于在您的示例中未使用 -d "%Y-%m-%d" 部分,因此已将其删除。 ${filename;s/^(\d{4}).*/$1/} 使用正则表达式匹配文件名的前四个数字并去除其余部分。 ${filename;s/^\d{4}(\d\d).*/$1/} 去除前四个数字,匹配接下来的两个数字,并去除文件名的其余部分。 %F 是 ExifTool 的变量,用于文件名+扩展名,用于各种 ExifTool 文件操作,例如重命名和移动(但在标签处理中不可用)。


谢谢!这个代码完美运行,但是我发现了另一种情况。我有一些文件格式为YYYYMMDD_xxxxx.avi和一些是YYYY-MM-DD_xxxxx.avi,其中xxxxx是一些随机数。这个正则表达式的格式化结果是:'D:/Pictures/2012-05-24/2009-01-07 114.avi' --> 'D:/Pictures/2009/2009-01-07 114.avi/2009-01-07 114.avi'。我知道我可以更改正则表达式以正确格式化每个文件名,但是如何使用您提供的正则表达式有条件地仅重命名与YYYYMMDD_xxxxx.avi格式匹配的文件名,但忽略具有破折号的其他文件? - crichavin
“-if”函数没有显示它接受正则表达式:http://owl.phy.queensu.ca/~phil/exiftool/exiftool_pod.html#Processing-control - crichavin
if选项允许使用“类Perl逻辑表达式”,因此您可以像这样使用Perl绑定运算符:-if "$filename=~/^\d{8}_\d{6}/",以仅匹配具有8位数字下划线6位数字模式的文件。 - StarGeek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接