我一直想出一个脚本来从等于“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 脚本,因此在这里发布!
非常感谢!
我已经接受了您的要求并编写了一个新脚本。您可能需要自定义 ,
set -- .
以便将点替换为图像的默认路径。或者您可以在命令行上提供图像目录当你高兴的时候把它去掉,
echo
它会做你想做的事。echo exiftool
我们在这里使用 bash 数组。例如
fields
,一个包含 EXIF 键名列表的数组,其中包含 textOLYMPUS DIGITAL CAMERA
,并且是删除字段值exifargs
的相应参数列表。exiftool
我们可以exifargs
直接生成,awk
但显示这两个步骤发生了什么似乎更容易。