【问题标题】:exiftool prevent duplicate iptc:keywords/xmp-dc:subject when using add +=exiftool 在使用 add += 时防止重复 iptc:keywords/xmp-dc:subject
【发布时间】:2021-01-30 20:55:30
【问题描述】:

问题:

当我有一个带有 iptc:keywords=holliday 的 jpg 并且我执行时

  • exiftool myImage.jpg -IPTC:Keywords+=holliday -IPTC:Keywords+=ocean

图片有两个“holliday”标签

为了避免我目前使用的重复

  • exiftool myImage.jpg -IPTC:Keywords-=holliday -IPTC:Keywords+=holliday -IPTC:Keywords-=ocean -IPTC:Keywords+=ocean

如果 jpg 中尚不存在关键字,则“-=”无效。

但是这种方法的缺点是,即使没有必要,也总是修改 jpg,因为关键字已经存在。

是否有更有效的 axiftool-api 调用方式来添加仅在必要时更改的关键字/主题?

背景:

目前我正在为 android 和 pc 之间的关键字/主题实现元数据同步。

android 为所做的每个更改生成一个 msdos 批处理脚本条目,我使用基于 exiftool 的 bat 用于在 pc 端应用元数据更改的脚本

由于 pc 关键字更改可能来自不同的 android 设备,因此必须添加/删除关键字,并且不能完全设置。

【问题讨论】:

    标签: batch-file xmp exiftool iptc


    【解决方案1】:
    exiftool.exe myImage.jpg -if "not $keywords =~ \"holliday\""  -IPTC:Keywords+=holliday
    

    如果关键字不存在,请添加它。

    编辑以适应 cmets

    exiftool.exe ^
        -if "not $keywords =~ \"holliday\""  -IPTC:Keywords+=holliday ^
        -execute ^
        -if "not $keywords =~ \"ocean\""  -IPTC:Keywords+=ocean ^
        -common_args myImage.jpg
    

    【讨论】:

    • 如果我在一个 exif api 调用中有多个关键字,这种语法是否也有效?示例:我已经有 holliday 并且我想确定之后 hollidayocean 已设置好?
    • 这种方法确实有很多你应该注意的弱点。首先,如果您要查找的单词是现有关键字的子字符串,它将失败。例如,如果您要添加“海洋”并且“太平洋”或“海洋前沿”已经存在,则不会添加“海洋”。 $keywords =~ 是一个正则表达式,如果您的关键字包含任何特殊字符[\^$.|?*+(),那么您会得到意想不到的结果。最后,此命令将为每个关键字读取每个文件一次。添加5个关键字,即5遍。添加大量关键字可能会影响性能。
    • @MC ND,您可以使用单引号而不是转义双引号,例如-if "not $keywords =~ 'holliday'"
    • @StarGeek,你是对的,只是快速而肮脏的解决方案。文件被多次解析,但我没有看到另一种方法来处理它只调用一次可执行文件(至少在 Windows exiftool 进程创建很慢)而不编写代码。但是我们在这里是为了帮助和学习,所以,如果您知道更好/更快/更安全/的处理方式,请发布另一个答案。
    • 对于安全稳定的长期同步解决方案,OPs 原始命令是最好的,并且是Exiftool FAQ 17 中建议的解决方案。为了使 IF 命令更健壮,我将添加 sep 选项并执行以下操作:-sep "##" -if "not $keywords==~/(^|##)(ocean)($|##)/" 这将阻止子字符串匹配。其他弱点仍然存在,只是需要牢记。
    【解决方案2】:

    关于Linux bash的一些研究:

    exiftool -if 'not $keywords =~ /holiday/' -Keywords+=holiday myImage.jpg ;
    exiftool -if 'not $keywords =~ /ocean/' -Keywords+=ocean myImage.jpg ;
    

    双引号在这里不起作用,所以这里有一种处理单引号的方法:

    exiftool -if 'not $Keywords =~ /harry'\''s/' -Keywords+='harry'\''s' myImage.jpg ;
    

    如果您的正则表达式必须不区分大小写:

    exiftool -if 'not $Keywords =~ /joe/i' -Keywords+='Joe' myImage.jpg ;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-14
      • 2015-10-08
      • 1970-01-01
      • 2016-11-06
      • 1970-01-01
      • 2013-10-09
      • 1970-01-01
      相关资源
      最近更新 更多