我有一个包含许多图像文件的目录,这些文件没有设置它们的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设置为从文件名格式化的日期,而不是文件修改日期。
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 "$filename=~/^\d{8}_\d{6}/"
,以仅匹配具有8位数字下划线6位数字模式的文件。 - StarGeek