如何使用 ExifTool 从文件名设置文件的 DateTimeOriginal
How to set file's DateTimeOriginal from file name using ExifTool
我有一个包含许多图像文件的目录,这些文件没有设置 DateTimeOriginal 元数据,但文件名本身确实有这个日期,格式为 YYYMMDD
,例如20120524_091536.mp4
我想使用 exiftool 将这些文件移动到包含年份的文件夹中,然后是月份的子文件夹中(然后稍后还使用文件名中的此日期设置其 DateTimeOriginal)。
像这样:
exiftool -d "%Y-%m-%d" "-testname<D:\Pictures${filename#;DateFmt('%Y')}${filename#;DateFmt('%m')}$FileName" "D:\Pictures12-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。
从文件名设置DateTimeOriginal
,命令很简单
exiftool "-DateTimeOriginal<Filename" -if "not $datetimeoriginal or ($datetimeoriginal eq '0000:00:00 00:00:00')" -ext jpg DIR
这是基于 Exiftool FAQ #5 的 "ExifTool is very flexible about the actual format of input date/time values when writing, and will attempt to reformat any values into the standard format unless the -n option is used. Any separators may be used (or in fact, none at all). The first 4 consecutive digits found in the value are interpreted as the year, then next 2 digits are the month, and so on."
我删除了您示例的 $filetype eq "JPEG"
部分并将其替换为 -ext option 因为检查 Filetype
是限制处理文件的糟糕方法,因为 exiftool 仍会处理并从每个文件中提取所有元数据以执行检查。
请注意,如您的示例所示,.mp4 文件类型不能包含 DateTimeOriginal
标记。相反,您必须使用 CreateDate
之类的东西。另请注意,exiftool 写入视频文件的能力有限。
因为文件名不是时间戳类型标签,所以不能使用 -d (dateformat) option as you discovered. Instead, you would have to use the Advanced formatting feature 拆分文件名。给定第一个示例文件名,您的命令将是:
exiftool "-testname<D:\Pictures${filename;s/^(\d{4}).*//}${filename;s/^\d{4}(\d\d).*//}\%F" "D:\Pictures12-05-24" -r
-d "%Y-%m-%d"
部分已删除,因为您的示例中未使用它。 ${filename;s/^(\d{4}).*//}
使用正则表达式匹配文件名的前四位数字并去除其余部分。 ${filename;s/^\d{4}(\d\d).*//}
去除前四位数字,匹配接下来的两位,并去除文件名的其余部分。 %F
是一个exiftool变量,用于文件名+ext,用于各种exiftool文件操作,如重命名和移动(但在标记处理中不可用)。
我有一个包含许多图像文件的目录,这些文件没有设置 DateTimeOriginal 元数据,但文件名本身确实有这个日期,格式为 YYYMMDD
,例如20120524_091536.mp4
我想使用 exiftool 将这些文件移动到包含年份的文件夹中,然后是月份的子文件夹中(然后稍后还使用文件名中的此日期设置其 DateTimeOriginal)。
像这样:
exiftool -d "%Y-%m-%d" "-testname<D:\Pictures${filename#;DateFmt('%Y')}${filename#;DateFmt('%m')}$FileName" "D:\Pictures12-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。
从文件名设置DateTimeOriginal
,命令很简单
exiftool "-DateTimeOriginal<Filename" -if "not $datetimeoriginal or ($datetimeoriginal eq '0000:00:00 00:00:00')" -ext jpg DIR
这是基于 Exiftool FAQ #5 的 "ExifTool is very flexible about the actual format of input date/time values when writing, and will attempt to reformat any values into the standard format unless the -n option is used. Any separators may be used (or in fact, none at all). The first 4 consecutive digits found in the value are interpreted as the year, then next 2 digits are the month, and so on."
我删除了您示例的 $filetype eq "JPEG"
部分并将其替换为 -ext option 因为检查 Filetype
是限制处理文件的糟糕方法,因为 exiftool 仍会处理并从每个文件中提取所有元数据以执行检查。
请注意,如您的示例所示,.mp4 文件类型不能包含 DateTimeOriginal
标记。相反,您必须使用 CreateDate
之类的东西。另请注意,exiftool 写入视频文件的能力有限。
因为文件名不是时间戳类型标签,所以不能使用 -d (dateformat) option as you discovered. Instead, you would have to use the Advanced formatting feature 拆分文件名。给定第一个示例文件名,您的命令将是:
exiftool "-testname<D:\Pictures${filename;s/^(\d{4}).*//}${filename;s/^\d{4}(\d\d).*//}\%F" "D:\Pictures12-05-24" -r
-d "%Y-%m-%d"
部分已删除,因为您的示例中未使用它。 ${filename;s/^(\d{4}).*//}
使用正则表达式匹配文件名的前四位数字并去除其余部分。 ${filename;s/^\d{4}(\d\d).*//}
去除前四位数字,匹配接下来的两位,并去除文件名的其余部分。 %F
是一个exiftool变量,用于文件名+ext,用于各种exiftool文件操作,如重命名和移动(但在标记处理中不可用)。