从Google Takeout批量合并JSON和JPG文件

26
我想离开谷歌相册,使用Google Takeout下载了所有照片。现在我有大量包含json文件(我认为包含exif数据)和图像的文件夹。结构看起来像这样:home/user/Billeder/Takeout/Google Photos/2011-06-09/file.json. home/user/Billeder/Takeout(2)/Google Photos/2011-07-09/file.json.
我想将json数据与正确的图像匹配,并将图像组织到与它们创建日期对应的文件夹中。 我一直在查看Exiftool,但到目前为止找到的所有答案都只显示如何处理单个图像。我要找的是一种批量加入所有数据并将其与正确的图像匹配的方法。
我正在尝试在Linux命令行中完成此操作。 有一种方法可以做到这一点吗?
4个回答

34
Exiftool现在已经具备这个功能,自10.47版本起支持此操作。在我的测试中,JSON文件名有两种不同的格式,一种是filename.ext.json,另一种是filename.json(JSON文件名没有扩展名)。下面提供两种命令以覆盖这两种情况。如果你跟我一样有混合的情况,请同时运行这两个命令。
对于带有扩展名的JSON文件:
exiftool -tagsfromfile '%d/%F.json' '-ImageTag<JsonTag' FileOrDir
对于没有扩展名的JSON文件:
exiftool -tagsfromfile '%d/%f.json' '-ImageTag<JsonTag' FileOrDir
FileOrDir替换为要处理的文件或目录。将ImageTag替换为要拷贝到的图像标签名称。将JsonTag替换为要从JSON文件中拷贝的标签名称。如果您使用的是Windows而不是Linux,请使用双引号代替单引号。
以下是我在JSON文件中遇到的一些更有用的标签以及将它们复制到何处的建议。其中两个标签名称Description和Title与相关的XMP标签相同,因此它们不需要重定向到图像标签名称,可以简单地保留为-Description-Title
description: 文件的描述。适当的位置是IPTC:Caption-Abstract、XMP:Description和EXIF:ImageDescription。你可以使用'-Caption-Abstract<Description'-Description,或'-ImageDescription<Description'进行拷贝。
title: 上传文件的名称。这个标签可以复制到TitleObjectDescriptionPreservedFileName中。
people: 我不确定,但我猜测如果文件在像Picasa这样的程序中已经标记了人物,则这将是姓名列表,很可能是来自RegionPersonDisplayName
url: 这是一个可以从中下载图像的URL。警告:这是一个公开共享的URL,即使图像被标记为私有,它也可以使用此URL下载。
GeoInfoAltitude_GeoInfoLatitude_GeoInfoLongitude_: 如果上传的文件带有地理标记,则这些标签将是图像的海拔高度、纬度和经度。最好将它们复制到GPSAltitudeGPSLatitudeGPSLatitudeRefGPSLongitudeGPSLongitudeRef中。由于GPS标签的性质(无符号),位于西半球和/或南半球的图像必须设置Ref标签。
示例命令:
拷贝gps标签:
exiftool -tagsfromfile '%d/%F.json' '-GPSAltitude<GeoDataAltitude' '-GPSLatitude<GeoDataLatitude' '-GPSLatitudeRef<GeoDataLatitude' '-GPSLongitude<GeoDataLongitude' '-GPSLongitudeRef<GeoDataLongitude' FileOrDir
拷贝关键字:
exiftool -tagsfromfile '%d/%F.json' '-Keywords<Tags' '-Subject<Tags' FileOrDir
拷贝描述:
exiftool -tagsfromfile '%d/%F.json' '-Caption-Abstract<Description' '-Image
exiftool -r -d %s -tagsfromfile "%d/%F.json" "-GPSAltitude<GeoDataAltitude" "-GPSLatitude<GeoDataLatitude" "-GPSLatitudeRef<GeoDataLatitude" "-GPSLongitude<GeoDataLongitude" "-GPSLongitudeRef<GeoDataLongitude" "-Keywords<Tags" "-Subject<Tags" "-Caption-Abstract<Description" "-ImageDescription<Description" "-DateTimeOriginal<PhotoTakenTimeTimestamp" -ext jpg -overwrite_original FileOrDir

编辑(2018年1月):一如既往,谷歌将改变一切。根据下面的评论,上述 GeoInfo* 标签已被弃用,并被替换为 GeoDataAltitudeGeoDataLatitudeGeoDataLongitude

编辑(2020年10月):更新2020年JSON格式的命令。

Exiftool可以读取Json文件,所以如果有其他更改,运行命令 exiftool -s FILE.Json 将列出所有标签和可复制的可用数据。


太棒了。谢谢你。 - Lasserh
非常好的信息,谢谢。如果目标字段已经包含信息会发生什么?例如,您能否只在为空时写入?或者合并?(对于关键字而言,在GPS方面可能没有意义) - matt wilkie
2
说句实话,我注意到有人为此制作了一个专用工具:https://github.com/mattwilson1024/google-photos-exif - Pieter
1
给定的命令仍能顺利运行。谢谢!(2021年7月) - fyb
我认为添加"-CreateDate<CreationTimeTimestamp" "-ModifyDate<PhotoLastModifiedTimeTimestamp"更好。 - Namek Master
显示剩余2条评论

5
2020年12月更新:正如Pieter提到的那样,有一款专门的工具可以帮助我进行设置,只需大约5分钟:https://github.com/mattwilson1024/google-photos-exif。然而,这并没有解决其他答案中提到的问题(如PHOTO_NAME(1).jpgPHOTO_NAME.jpg(1).json混淆)以及时区问题。更重要的是,这里的任何答案都没有覆盖QuickTime和PNG特定的标签。
我发现这个软件https://metadatafixer.com/更加简单明了。它需要付费,但是很值得。

2

2

我在这里分享我最终使用的内容。

https://gist.github.com/tetebueno/5800504133709c9844bcd1779019d390

这段代码唯一无法处理的情况是当文件名太长(超过46个字符(?)),并且具有自动照片后缀(-edited等)时,会出现以下情况:

very_large_file_name_..._foo-edited.jpg -> very_large_file_name_..._foo-edi.json

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接