AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 684867
Accepted
willdashwood
willdashwood
Asked: 2022-01-04 12:20:08 +0800 CST2022-01-04 12:20:08 +0800 CST 2022-01-04 12:20:08 +0800 CST

通过 exiftool 同时删除多个属性

  • 772

我一直想出一个脚本来从等于“OLYMPUS DIGITAL CAMERA”的JPEG文件中删除任何EXIF/IPTC/XML元数据。对于那些不知道的人,奥林巴斯相机在所有照片中都设置了这个属性,没有关闭它的选项。更糟糕的是,虽然我已经设置了 Lightroom 预设以在导入时或在编辑现有图像时将其删除,但在最近的 LR 版本中似乎存在一个错误,在导出图像时仍将属性嵌入到 ImageDescription、Caption-Abstract 和 Description 中图像为 JPEG。

因此,像许多 Olympus 用户一样,我希望它永远被淘汰,并且我编写了一个非常简单的 bash 脚本来做到这一点。它主要设计用于在我的 QNAP NAS 上运行,但可以轻松修改以在不同环境中工作。它在特定图像的 exiftool 输出中搜索“OLYMPUS DIGITAL CAMERA”的任何实例,然后删除该属性。

#!/usr/bin/env bash
IFS=$'\n'; ## Handle spaces in file paths/names
directory="/share/CE_CACHEDEV1_DATA/homes/admin/Images/Final Albums/"
exiftool="/share/CE_CACHEDEV1_DATA/.qpkg/Entware/bin/exiftool"
find="/opt/bin/find"

for f in $($find "$directory" -type f -iname '*.jp*g');
do
    #echo "$f"
    for field in $($exiftool -s "$f" | grep "OLYMPUS DIGITAL CAMERA" | awk -F: '{ print $1 }' | sed 's/ *$//g');
    do
        echo "Removing $field on $f"
        $exiftool -overwrite_original -"$field"= "$f"
    done
done

唯一的问题是它很慢。对 exiftool 的任何调用似乎都需要 0.5 秒,因此我想通过一次性删除所有属性来提高效率,而不是循环每个匹配的属性并逐个删除它们。所以这是脚本的第 2 版。

#!/usr/bin/env bash
IFS=$'\n'; ## Handle spaces in file paths/names
directory="/share/CE_CACHEDEV1_DATA/homes/admin/Images/Final Albums/"
exiftool="/share/CE_CACHEDEV1_DATA/.qpkg/Entware/bin/exiftool"
find="/opt/bin/find"
for f in $($find "$directory" -type f -iname '*.jp*g');

do
    #echo "$f"
    fieldstring=''
    for field in $($exiftool -s "$f" | grep "OLYMPUS DIGITAL CAMERA" | awk -F: '{ print $1 }' | sed 's/ *$//g');
    do
        fieldstring="${fieldstring}-$field= "
    done
    echo $fieldstring
    $exiftool -overwrite_original $fieldstring $f
done

问题是它似乎一次只删除一个属性。$fieldstring 的输出是:

-ImageDescription= -Caption-Abstract= -Description=

但是我也尝试过用单引号和双引号包围要删除的标签,但都没有帮助。

我想这可能是 eximtool 的限制。但是我编写了另一个脚本,它只是擦除了 3 个主要属性(ImageDescription、Caption-Abstract 和 Description),而没有对它们包含的内容进行任何测试,而且效果很好!

#!/usr/bin/env bash
IFS=$'\n'; ## Handle spaces in file paths/names
directory="/share/CE_CACHEDEV1_DATA/homes/admin/Images/Final Albums/"
exiftool="/share/CE_CACHEDEV1_DATA/.qpkg/Entware/bin/exiftool"
find="/opt/bin/find"
for f in $($find "$directory" -type f -iname '*.jp*g');
do
    echo "$f"
    $exiftool -overwrite_original -"Description"= -"Caption-Abstract"= -"ImageDescription"= "$f"
done

所以我很确定这是我犯的那些愚蠢的、直接犯下的错误之一,但经过 2 小时的努力想弄清楚,我不知所措。谁能发现一个愚蠢的错误?我已经输出了 $fieldstring 并且对我来说看起来不错,所以我认为这是我缺少的 bash 脚本,因此在这里发布!

非常感谢!

bash exif
  • 1 1 个回答
  • 73 Views

1 个回答

  • Voted
  1. Best Answer
    roaima
    2022-01-05T01:57:31+08:002022-01-05T01:57:31+08:00

    我已经接受了您的要求并编写了一个新脚本。您可能需要自定义 ,set -- .以便将点替换为图像的默认路径。或者您可以在命令行上提供图像目录

    #!/usr/bin/env bash
    #
    export PATH=/opt/bin:$PATH           # Prefer commands from Entware
    
    [[ $# -eq 0 ]] && set -- .           # Replace . with default path to source of images
    unwanted='OLYMPUS DIGITAL CAMERA'    # phrase to match and remove
    
    find "$@" -type f \( -iname '*.jpg' -o -iname '*.jpeg' \) -print |
        while IFS= read -r file
        do
            # Get list of fields containing the unwanted phrase
            fields=($(exiftool -s "$file" | awk -v x="$unwanted" '$0 ~ x {print $1}'))
    
            # Skip files with no issues
            [[ ${#fields[@]} -eq 0 ]] && continue
    
            # Convert fields to exiftool parameters
            exifargs=()
            for field in "${fields[@]}"
            do
                exifargs+=("-$field=")
            done
    
            # Apply the conversion
            echo "Removing ${fields[@]} from: $file"
            echo exiftool -overwrite_original "${exifargs[@]}" "$file"
        done
    
    # Done
    exit 0
    

    当你高兴的时候把它去掉,echo它会做你想做的事。echo exiftool

    我们在这里使用 bash 数组。例如fields,一个包含 EXIF 键名列表的数组,其中包含 text OLYMPUS DIGITAL CAMERA,并且是删除字段值exifargs的相应参数列表。exiftool我们可以exifargs直接生成,awk但显示这两个步骤发生了什么似乎更容易。

    • 0

相关问题

  • 通过命令的标准输出以编程方式导出环境变量[重复]

  • 从文本文件传递变量的奇怪问题

  • 虽然行读取保持转义空间?

  • `tee` 和 `bash` 进程替换顺序

  • 运行一个非常慢的脚本直到它成功

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve