【问题标题】:How to set file's DateTimeOriginal from file name using ExifTool如何使用 ExifTool 从文件名中设置文件的 DateTimeOriginal
【发布时间】:2019-05-20 15:23:25
【问题描述】:

我有一个包含许多图像文件的目录,这些文件没有设置 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,我需要将其设置为从文件名格式化的日期。

【问题讨论】:

    标签: batch-file cmd exiftool


    【解决方案1】:

    从文件名中设置DateTimeOriginal,命令很简单
    exiftool "-DateTimeOriginal&lt;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&lt;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 是文件名+ext 的 exiftool 变量,用于各种 exiftool 文件操作,例如重命名和移动(但在标签处理中不可用)。

    【讨论】:

    • 谢谢!这很完美,但现在发现了另一种情况。我有一些格式为YYYYMMDD_xxxxx.avi 的文件,一些是YYYY-MM-DD_xxxxx.avi,其中xxxxx 是一些随机的nbr。此正则表达式格式会导致:'D:/Pictures/2012-05-24/2009-01-07 114.avi' --&gt; 'D:/Pictures/2009/2009-01-07 114.avi/2009-01-07 114.avi'。我知道我可以更改正则表达式以正确格式化每个场景,但是如何有条件地仅使用您提供的正则表达式重命名与 YYYYMMDD_xxxxx.avi 格式匹配的文件名,而忽略其他带有破折号的文件?
    • -if 函数没有显示它除了正则表达式:owl.phy.queensu.ca/~phil/exiftool/…
    • if 选项允许“类 Perl 逻辑表达式”,因此您可以像这样使用 Perl 绑定运算符:`-if "$filename=~/^\d{8}_\d {6}/" 仅匹配具有 8digitsUnderscore6Digits 模式的文件。
    猜你喜欢
    • 1970-01-01
    • 2017-05-16
    • 2018-07-12
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多