我有一个目录,其中包含许多未设置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设置为filemodifydate,而是将其设置为以文件名格式设置的日期。
答案 0 :(得分: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 option,因为检查Filetype
是限制处理文件的一种糟糕方法,因为exiftool仍会处理和提取文件每个文件中的所有元数据以执行检查。
请注意,如您的示例所示,.mp4文件类型不能包含DateTimeOriginal
标记。相反,您必须使用类似CreateDate
的名称。还要注意,exiftool写入视频文件的能力有限。
由于文件名不是时间戳记类型标记,因此无法使用发现的-d (dateformat) option。相反,您将必须使用Advanced formatting feature来拆分文件名。给定第一个示例文件名,您的命令将是:
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变量,用于文件名+ ext,用于各种exiftool文件操作,例如重命名和移动(但在标记处理中不可用)。