Я придумал сценарий для удаления любых метаданных EXIF/IPTC/XML из файла JPEG, который равен «OLYMPUS DIGITAL CAMERA». Для тех, кто не знает, камеры Olympus устанавливают этот атрибут на всех фотографиях без возможности его отключения. Что еще хуже, хотя я настроил предустановку Lightroom, чтобы удалить ее при импорте или при редактировании существующих изображений, в последних выпусках LR, похоже, есть ошибка, которая все еще встраивает атрибут в ImageDescription, Caption-Abstract и Description при экспорте. изображение в JPEG.

Поэтому, как и многие пользователи Olympus, я хочу, чтобы он был изгнан навсегда, и я написал для этого очень простой скрипт bash. Он предназначен в первую очередь для работы на моем QNAP NAS, но его можно легко модифицировать для работы в других средах. Он ищет любой экземпляр «OLYMPUS DIGITAL CAMERA» в выходных данных exiftool для определенного изображения, а затем удаляет этот атрибут.

#!/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, который мне не хватает, поэтому публикую здесь!

Большое спасибо!

0
willdashwood 4 Янв 2022 в 13:26
1
Извините, я удалил shebang и начальную переменную, установленную во вторых двух сценариях, просто для простоты. Я отредактировал пост сейчас.
 – 
willdashwood
4 Янв 2022 в 12:12

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 CAMERA, а exifargs — это соответствующий список аргументов для exiftool, которые удаляют значения полей. . Мы могли бы сгенерировать exifargs напрямую с помощью awk, но было бы проще показать, что происходит с двумя шагами.

0
roaima 4 Янв 2022 в 13:56
Спасибо, что нашли время написать альтернативный сценарий. Я думаю, вы пропустили использование переменной «нежелательный». Достаточно легко исправить, конечно. Но, честно говоря, я только что понял, что если exiftool не нужно вносить никаких изменений, он не затрагивает рассматриваемый файл. Я беспокоился, что если я запущу свой третий скрипт в исходном посте, он обновит все файлы, а мой скрипт резервного копирования для папки с изображениями захочет синхронизировать все файлы. Похоже, это не так, поэтому я думаю, что буду придерживаться этого. Меня просто беспокоило, что я не мог понять, почему мой скрипт не работает!
 – 
willdashwood
4 Янв 2022 в 13:31
P.S. Тем не менее, я могу многому научиться из вашего сценария и на самом деле могу пригодиться, если есть другие поля, от которых я хочу избавиться, а не только ImageDescription, Caption-Abstract и Description. Еще раз спасибо!
 – 
willdashwood
4 Янв 2022 в 13:42
Спасибо, что заметили неиспользуемую переменную. Я прикрепил его к awk, как и собирался изначально.
 – 
roaima
4 Янв 2022 в 13:57