我正在处理一组使用多种不同的相机和摄像机捕获的无组织的大型媒体文件,我想在 bash 脚本中使用 exiftool 来重命名每个文件及其创建日期和时间、制造商和型号。
使用此命令可以按我想要的方式重命名图像:
exiftool -m -P '-filename<${DateTimeOriginal}_${Make}_${Model}.%e' myfile.jpg
我已经知道我可以使用 -d FMT 选项来格式化日期和时间,但为了清楚起见我省略了它。
以下是我使用 DSLR“*.mov”视频时遇到的问题:
- exiftool 删除了 .mov 扩展名,即使它在文件名模型中使用“.mov”而不是“.%e”
- 这些文件没有 DateTimeOriginal 标签,而我必须使用其他文件没有的 MediaCreateDate 标签
有人知道如何“强制”exiftool 使用原始的.mov 扩展名吗?
有没有办法告诉 exiftool 检查 exif 标签是否存在?如果第一个标签不存在,则使用另一个标签?
我尝试过类似
if [ -n `exiftool -m -p '$DateTime' filename]
then
...
但是 exiftool 向我抛出了一个错误,所以空字符串检查总是失败。有什么建议吗?
答案1
感谢 exiftool 开发者 Phil Harvey 的反馈,他为我的问题找到了一个非常简单的解决方案,适用于 exiftool 9.30。
Phil 在这里说 (http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,5079.msg24483.html#msg24483):
最后的有效分配优先于其他分配。
所以我们只需一个命令就可以完成所有操作。以下是最终代码:
#!/bin/bash
exiftool -P -d '%Y-%m-%d %H.%M.%S' \
'-filename<${CreateDate}_${Model;}.%e' \
'-filename<${DateTimeOriginal}_${Make;}.%e' \
'-filename<${DateTimeOriginal}_${Make;}_${Model;}.%e' \
$@
分号是解决上述缺少扩展问题的一种解决方法(实际上,这是因为我的模型标签中尾随空值)。
这种方法的一个好处是我们没有使用该-m
选项,因此我们不会弄乱例如没有 exif 标签的 *.mov 文件,就像大多数可以从网上下载的视频一样(它们被忽略)。
答案2
据我所知,exiftool 不支持写入 .mov 格式,这也许解释了为什么它不想创建具有该扩展名的文件,即使只是重命名。
如果其中一个标签为空,您需要一些逻辑来查看备用标签,因此我建议您仅使用 exiftool 来提取所需的信息;然后自己重命名文件。这里有一个 bash 脚本,可以帮助您开始使用这个想法,它不是开箱即用的;它只是用来查看如何完成的 :)
#!/bin/bash
# Scan the files you need
for i in *jpg *mov; do
# Get the extension of the previous file
extension=${i##*.}
# Extract metadata from the file
model=$( exiftool -f -s3 -"Model" "${i}" )
make=$( exiftool -f -s3 -"Make" "${i}" )
datetime=$( exiftool -f -s3 -"DateTimeOriginal" "${i}" )
# If the datetime value is empty (returned '-' because of the '-f' option)
# then read another tag
if [ "${datetime}" = '-' ]; then
datetime=$( exiftool -f -s3 -"MediaCreateDate" "${i}" )
fi
# Construct the new filename from the metadata gathered above
newfilename="${datetime}-${make}-${model}.${extension}"
# Check if the destination filename already exists, and if not,
# create the file
if [ ! -e "${newfilename}" ]; then
echo mv "${i}" "${newfilename}"
else
echo "${i} would get renamed to ${newfilename} but that file already exists."
fi
done