Exiftool 使用手册

ExifTool by Phil Harvey 是一个很强大的元数据处理工具,它可以读取包括图片视频在内的大多数格式文件的元数据;支持文件重命名和文件夹整理;支持不同文件之间的元数据相互拷贝;读取生产 xpm 文件等等。这里我们主要是使用 ExifTool 进行图片管理,介绍其在图片管理中的一些常用命令。

macOS 中的图片元数据

macOS 的 Photos 应用支持标题、关键词、描述、时间的查看和处理,其它元数据好像没看到具体使用场景,后面的命令行也主要针对以上元数据的管理。

exiftoolmacos 的属性对应关系如下:

exiftool macOS
Title Title
Subject Keyword
ImageDescription Description
DateTimeOriginal Create Date

描述标签

Exif:ImageDescriptionXMP:Description 是两个独立的描述标签,macOS 将(优先)使用 Exif:ImageDescription 作为描述标签显示。然而,当 Exif:ImageDescription 已经存在的情况下,从 Photos 应用重新导出的照片并不会将修改的描述写入 Exif:ImageDescription, 而是只写入 XMP:Description. 因此需要将 XMP:Description 赋值到 Exif:ImageDescription.

读取元数据

读取元数据只需在命令后添加文件名。

exiftool [OPTIONS] [-TAG...] [--TAG...] FILE...

读取所有标签:

1
exiftool image.png

读取特定标签:

1
exiftool -FileName -ImageDescription image.png

排除特定标签:

1
exiftool --FileName image.png # 返回除 filename 外的所有标签

标签组别

每个标签都有对应的组别,可添加 -g-G 选项让其显示。同时可以使用 -a 选项显示不同组别中的重复选项

1
2
3
exiftool -g image.png # 显示组别
exiftool -G image.png # 显示组别
exiftool -G  -a image.png # 显示组别 (包括重复选项)

排序

可以通过 -Sort 选项让输出按字母顺序排序。

1
exiftool  -Sort  -G img.png

Wildcard 筛选

标签也可以使用 wildcard 进行筛选。使用时,标签需要加上引号,或对特殊字符进行转义。

1
2
exiftool -G -"*GPS*" image.png # 查看所有包含 GPS 字段的标签
exiftool -G -Composite:GPS\* img.png # 只选择 composite 组别的元素

使用 -s 自定义输出

使用 -s 时将去除标签名中的空格,使用 -s -s-S 将去除标签名与冒号之间的空格,而使用-s -s -s则将只留下标签取值。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
➜ exiftool -Filename img.png
File Name                       : img.png

➜ exiftool -Filename -s img.png
FileName                        : img.png  #File Name -> FileName

➜ exiftool -Filename -s -s img.png # or -S or -s2
FileName: img.png                         # "FileName     :" -> FileName:

➜ exiftool -Filename -s -s -s img.png #or -s3
img.png                           # "FileName": ""

格式化打印

使用 -p 选项可以格式化输出图片信息,图片信息使用 \$ 字符表示。注意转义字符的使用。

1
2
➜ exiftool -p "This picture was taken at \$Composite:GPSPosition" img.png
This picture was taken at 35 deg 0' 12.03" N, 92 deg 59' 21.44" E

格式文件

也可以使用格式化文件指定打印格式。首先创建格式化文件 format.fmt, 其内容如下:

1
2
3
4
5
6
7
8
#[HEAD]-- Generated by ExifTool $exifToolVersion --
  File: $FileName - $DateTimeOriginal
  GPS Altitude: $GPSAltitude
 # this is a comment line. It won't print
  Latitude: $GPSLatitudeRef
  Longitude: $GPSLongitudeRef
  Position: $Composite:GPSPosition
 #[TAIL]-- end --

然后执行:

也可对指定目录对所有文件进行遍历输出:

1
exiftool -r -p format.fmt .

文件夹遍历

可以使用 -r 选项整个文件夹。如果想忽略某个子文件夹,可用 -i 选项排除。

1
exiftool -r -FileName -i subfolder ~/Pictures

指定文件类型

使用 -ext 指定遍历的文件类型,--ext 排除遍历的文件类型。

使用 - 选定,使用 -- 排除是 exiftool 中的通用做法。

使用 if

寻找指定关键词的文件:

1
exiftool -Filename -Subject -if "\$Subject eq 'Keyword'" .

多语言

使用 -lang 选项查看支持的语言:

1
2
3
4
5
6
➜ exiftool -lang
Available languages:
  en - English
  ...
  zh-cn - Simplified Chinese (简体中文)
  zh-tw - Traditional Chinese (繁體中文)

切换输出语言:

1
exiftool -lang zh-cn img.png

选项文件

我们也可以将常用的选项放在一个文件中,然后使用 -@ args.txt将其选项内容读取。

当然,你也可以在命令中添加其它选项。

Screen Shot 2021-03-17 at 5.01.09 PM

写入元数据

使用 -Tag=Value 的形式对元数据进行修改

exiftool [OPTIONS] -TAG[+-<]=[VALUE]... FILE...

可同时写入多个标签或多个文件:

1
2
3
4
5
6
# 多标签写入
exiftool -Subject=Keyword \
-Title=Title \
-ImageDescription=Description image.png
# 多文件写入
exiftool -Subject=Keyword  *.png  # 所以后缀为 png 的文件

增加关键词:

1
2
exiftool -Subject='a' -Subject='b' image.png # 关键词重置为 a 和 b
exiftool -Subject+='c' -o newfile.png  -image.png # 添加关键词 c 并另存为 newfile.png

删除标签

在等号后留空值可删除对应标签。当使用 wildcard 时,使用 -a 选项确保所有组别的对应标签都已删除。

1
2
exiftool .\TestPic.jpg -GPSCoordinates= # 删除特定标签
exiftool .\TestPic.jpg -GPS*= -a # 删除所有包含 GPS 的标签

选项顺序

选项顺序至关重要,exiftool 将从左到右对标签进行修改。因此需把删除的选项放最前面。

1
2
3
4
5
6
7
## Writes a value to *ApertureValue* first, then deletes all of the exif tags,
## including *ApertureValue*.
exiftool TestPic.jpg -ApertureValue="3.0" -EXIF:all=

## Erases all of the tags in the exif group, then writes
## a new value to *ApertureValue*, which is a tag in the exif group.
exiftool TestPic.jpg -EXIF:all= -ApertureValue="3.0"

文件备份与复原

当对文件进行修改时,exiftool 将会自动生成备份文件filename_original.ext, 以下是几个关于备份文件的操作选项。

  • -restore_original: 从备份文件还原

  • -delete_original: 删除备份文件

  • -overwrite_orignial: 避免生产备份文件

1
2
3
4
exiftool -Subject="" -overwrite_original image.png # 避免生产备份文件
exiftool -Subject="subject" image.png  # 该操作将生产备份文件 image_original.png
exiftool -restore_original image.png  # 复原备份文件
exiftool -delete_original image.png  # 删除备份文件

元数据导出、导入、复制

参考:Metadata Sidecar Files

从文件读取元数据

可以使用选项 -tagsFromFile SRCFILE 从文件中读取数据。

Copy tag values from SRCFILE to FILE. Tag names on the command line after this option specify the tags to be copied, or excluded from the copy. Wildcards are permitted in these tag names. If no tags are specified, then all possible tags from the source file are copied to same-named tags in the preferred location of the output file (the same as specifying -all). More than one -tagsFromFile option may be used to copy tags from multiple files.

在使用该选项时,选项后面的赋值将在选项拷贝完成后进行。例如下述命令的赋值顺序依次为:one, two, three, four.

1
 exiftool -One=1 -tagsFromFile s.jpg -Two -Four=4 -Three d.jpg

导出元数据文件

  1. 可以用 -tagsfromfile-o 选项导出元数据,两者区别在于使用 -o 选项时,输出的文件必须是新文件,不能事先存在。
1
2
3
4
#Copy same-named tags from all information types to preferred locations in XMP:
exiftool -tagsfromfile SRC.EXT DST.xmp
# same effect as above, but the command will exit with an error if the output XMP file already exists
exiftool SRC.EXT -o DST.xmp
  1. 可以使用 -all:all 选项确保写入的标签在相同的组别。
1
2
3
4

# Copy XMP, preserving original locations:
exiftool -tagsfromfile SRC.EXT -all:all DST.xmp
exiftool SRC.EXT -o DST.xmp -all:all
  1. 将 EXIF 和 IPTC 标签导入到 XMP 中。

    1
    2
    
    # Generate XMP from EXIF and IPTC using standard tag name mappings:
    exiftool -tagsfromfile SRC.EXT -@ exif2xmp.args -@ iptc2xmp.args DST.xmp
    
  2. 将 XMP 作为区块导出。这是将未知或只读标签导出到唯一方法。

    1
    2
    3
    4
    5
    6
    7
    8
    
    # Note that this will not deal with extended XMP segments in JPEG images if they exist.
    exiftool -tagsfromfile SRC.EXT -xmp DST.xmp
    
    # As with the previous command, this command will not copy extended XMP segments in JPEG images, but in this case the -a option may be added to also extract extended XMP blocks. However, the result would be a non-standard XMP file that ExifTool could read but other utilities may not.
    exiftool -xmp -b SRC.EXT > DST.xmp
    
    # same effect as above, but the destination file name will be the same as the source file, and this command will fail if the XMP file exists while the previous command will overwrite an existing file
    exiftool -xmp -b -w xmp SRC.EXT
    

写入元数据文件

xmp 文件元数据写入到图片:

1
2
3
4
5
exiftool -tagsfromfile SRC.xmp -all:all DST.jpg

# same effect as above except that any non-writable XMP tags would be copied by this command, and the 2 kB of padding recommended by the XMP specification is not added when copying as a block
exiftool -tagsfromfile SRC.xmp -xmp DST.jpg
exiftool "-xmp<=SRC.xmp" DST.jpg

应用场景

读取数据

1
2
3
4
# 读取文件
exiftool  -title -description -imagedescription -subject image.png -G -a
#读取文件夹
exiftool   -title -description -imagedescription -subject . -T

赋值

1
2
3
4
# Append title to description
exiftool '-description<${title} ${description}' image.png
# set imagedescription same as description
exiftool '-imagedescription<description' image.png

写入 xmp 文件

1
exiftool -ext jpg -tagsfromfile %d%f.xmp -all:all -r .

macOS 操作流程

  1. 将照片导入到 Photos 应用,添加关键词、标题,描述等字段。

  2. 导出未修改的照片和 xmp 文件

  3. 写入 xmp 文件

    1
    
    exiftool -ext jpg -tagsfromfile %d%f.xmp -all:all .
    
  4. 将标题添加到描述。其中 ${/} 表示换行,参考 Linebreak in Image Description.

    1
    2
    
    exiftool '-description<${title}${/}${description}' . -ext jpg
    exiftool '-ImageDescription<description' . -ext jpg
    

    也可直接换行:

    1
    2
    3
    
    exiftool '-description<${title}
    ${description}' . -ext jpg
    exiftool '-ImageDescription<description' . -ext jpg
    
  5. 重命名文件。参考:FileName and Directory tags

    1
    2
    3
    4
    
    # 测试语法是否正确
    exiftool '-testname<$title%-c.%e' -ext jpg .
    # 修改文件名
    exiftool '-filename<$title%-c.%e' -ext jpg .
    

元数据的读取

  1. 创建 ~/photo_args.txt 文件。

    1
    2
    3
    4
    5
    6
    
    -FileName
    -CreateDate
    -Title
    -Description
    -ImageDescription
    -Subject
    
  2. 使用如下命令读取元数据。

    1
    
    exiftool -@ ~/photo_args.txt *.jpg -T
    

相关工具

RhetTbull/photosmeta: Extract known metadata from Apple's MacOS Photos library and export this metadata to EXIF/IPTC/XMP fields in the photo file For example: Photos knows about Faces (personInImage) but does not preserve this data when exporting the original photo.

RhetTbull/osxphotos: Python app to export pictures and associated metadata from Apple Photos on macOS. Also includes a package to provide programmatic access to the Photos library, pictures, and metadata.

RhetTbull/PhotoScript: : Automate Apple / MacOS Photos app with python. Wraps applescript calls in python to allow automation of Photos from python code.

参考

ExifTool: The Ultimate Guide

updatedupdated2023-06-052023-06-05
Update https-ca.md