Exiftoolで同時に複数の属性を削除する

Exiftoolで同時に複数の属性を削除する

私は「OLYMPUS DIGITAL CAMERA」と同じJPEGファイルからEXIF / IPTC / XMLメタデータを削除するスクリプトを作成しようとしました。知らない人のために説明すると、Olympusカメラにはすべての写真にこのプロパティが設定されており、オフにするオプションはありません。説得力のあるものとして、インポートまたは既存の画像を編集するときにそれらを削除するようにLightroomプリセットを設定しましたが、最近のLRバージョンには、画像をエクスポートしたときに画像の説明、タイトルの要約がまだ残っていて、それを含むバグがあるようです。説明の属性です。画像をJPEGに変換します。

だから私は多くのOlympusユーザーのように、私はそれが永遠に消えたことを望み、そのために非常に単純なbashスクリプトを書いています。デフォルトでは QNAP NAS で動作するように設計されていますが、さまざまな環境で動作するように簡単に変更できます。 「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秒かかります。したがって、一致する各属性を繰り返し1つずつ削除するよりも、すべての属性を一度に削除する方が効率的であることを願っています。これはスクリプトの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

問題は、一度に1つの属性のみを削除するようです。 $fieldstringの出力は次のとおりです。

-ImageDescription= -Caption-Abstract= -Description=

しかし、削除するタグを一重引用符と二重引用符で囲みようとしましたが、どちらも役に立ちませんでした。

私はこれがeximtoolの限界だと思います。しかし、含まれているものをテストせずに、3つの主要な属性(画像の説明、タイトルの要約、説明)だけを消去する別のスクリプトを書いていましたが、うまくいきました!

#!/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スクリプトだと思うので、ここに投稿します!

とても感謝しています!

答え1

あなたのリクエストを受け入れて新しいスクリプトを作成しました。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キー名のリストOLYMPUS DIGITAL CAMERAexifargs、フィールド値を削除する対応するパラメータのリストを含む配列です。自分で作成することもできますが、exiftoolこれらの2つのステップで何が起こるかを示す方が簡単です。exifargsawk

関連情報