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초가 소요되는 것 같습니다. 따라서 일치하는 각 속성을 반복해서 하나씩 제거하는 것보다 모든 속성을 한 번에 제거하는 것이 더 효율적이기를 바랍니다. 이것은 스크립트의 두 번째 버전입니다.

#!/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가지 주요 속성(이미지 설명, 제목 요약, 설명)만 지우는 또 다른 스크립트를 작성했는데 훌륭하게 작동했습니다!

#!/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이 두 단계에서 어떤 일이 일어나는지 보여주는 것이 더 쉬워 보입니다.exifargsawk

관련 정보