我只喜欢在图像上设置年份,而不更改月份、日期或时间。
如果有一个 linux bash 命令就好了。
根据您正在做什么,exiftool可以在没有脚本的情况下批量执行此操作。
如果您的文件的年份偏移量相同,则您可以使用时移功能向前/向后移动时间(请参阅
-TAG[+-^]=[VALUE]
选项)
例如,要将年份向后移动两年,您可以使用如下命令
exiftool -AllDates-="2:0:0 0" /path/to/files/
并扭转它
exiftool -AllDates+="2:0:0 0" /path/to/files/
AllDates
是一个 exiftool 快捷方式,可编辑三个主要的 EXIF 标签:DateTimeOriginal
、DateTimeDigitized
(exiftool 称为 CreateDate
)和 DateTime
(exiftool 称为 ModifyDate
)。 2:0:0 0
代表要移动的年、月、日和小时,并且可以在小时后添加分钟和秒。对于单个数字,exiftool 默认会移动小时,因此要移动年、月或日,您必须在小时之前添加一个空格。
如果你想批量替换年份为完全不同的年份,那就会变得有点复杂。最简单的选择不是转移,而是使用
-api Filter
选项 将正则表达式应用于值,然后使用 -TagsFromFile
选项 将新值复制回文件中
例如,要将任何年份为 2026 年的文件更改为 2024 年,您可以使用如下命令
exiftool -api "Filter=s/2026/2024/" -TagsFromFile @ -AllDates /path/to/files/
-overwrite_original
以禁止创建备份文件。添加 -r
以递归到子目录。
我编写了以下 python 脚本。
现在我可以运行了:
find . -iname "*.JPG" -type f -exec ./exif-set-year-only.py {} 1980 2>cp.err \;
#!/usr/bin/env python3
import sys
import os
from exif import Image, DATETIME_STR_FORMAT
from datetime import datetime
def main():
if (len(sys.argv) - 1) != 2:
print('usage: %s filename year' % sys.argv[0] )
return
filename_in = sys.argv[1]
new_year = int(sys.argv[2])
path, fname = os.path.split(filename_in)
filename_out = os.path.join(path, "modified_" + fname)
print('reading: %s --> writing: %s' % (filename_in, filename_out))
with open(filename_in, 'rb') as image_file:
image = Image(image_file)
datetime_original = datetime.strptime(image['datetime_original'], DATETIME_STR_FORMAT)
new_datetime = datetime_original.replace(year=new_year)
print(' changing: %s --> %s' % (datetime_original.strftime("%m/%d/%Y, %H:%M:%S.%f"), new_datetime.strftime("%m/%d/%Y, %H:%M:%S.%f")))
image.datetime_original = new_datetime.strftime(DATETIME_STR_FORMAT)
image.datetime_digitized = new_datetime.strftime(DATETIME_STR_FORMAT)
image.datetime = new_datetime.strftime(DATETIME_STR_FORMAT)
with open(filename_out, 'wb') as new_image_file:
new_image_file.write(image.get_file())
if __name__ == "__main__":
main()
要使用自己的编程正确执行此操作,您需要解析 EXIF 流。
您需要寻找 SOI 标记,跳过任何 COM 标记,跳过任何 APPn 标记,直到找到 APP1 标记。
然后您将在 APP1 标记中的 TIF 数据中搜索日期标签。然后覆盖 8 位文本格式的日期。
所有这些都需要您通过 EXIF 和 TIF 标准。这些并不复杂(JPEG 标准很复杂)。
您的 shell 命令最终可能会损坏许多非 EXIF 格式的 JPEG 文件。