Как заставить Exiv2 применять метаданные из статического файла XML к нескольким изображениям?

Exiv2, похоже, неплохо работает с пакетными операциями, сохраняя все сгенерированные производные файлы с одним и тем же корневым именем файла с другим расширением.

Моя миссия состоит в том, чтобы извлечь метаинформацию из основного файла jpg, а затем применить ее к нескольким существующим меньшим версиям файла. У меня есть...

  Photo1.jpg        - contains meta information
  thumb_Photo1.jpg  - no meta information
  sample_Photo1.jpg - no meta information

Прямо сейчас я использую exiv2 для извлечения метаинформации из Photo1.jpg, в результате чего получается файл...

  Photo1.xml

Далее я хотел бы применить эти метаданные к файлам эскизов и образцов. С Exiv2 я не могу найти способ заставить его работать с чем-либо, кроме файлов с соответствующими базовыми именами. Таким образом, я не могу применить Photo1.xml к thumb_Photo1.jpg, только к Photo1.jpg.

На данный момент я обхожу это, делая копии файла XML, оставляя мне это...

  Photo1.jpg        - contains meta information
  Photo1.xml        - derived from Photo1.jpg
  thumb_Photo1.jpg  - no meta information
  thumb_Photo1.xml  - copy of Photo1.xml
  sample_Photo1.jpg - no meta information
  sample_Photo1.xml - copy of Photo1.xml

Сделав это, я могу запустить exiv2, чтобы добавить теги к большому пальцу и образцам JPEG. После этого я удаляю XML-файлы, оставляя три файла с одинаковыми тегами.

Хотя приведенное выше работает очень хорошо, мне интересно, не пропустил ли я опцию exiv2, скрытую глубоко в документации, которая позволяет пометить JPEG из XML-файла с другим базовым именем.

Эм... не exiftool -AllTagsFromFile=Photo1.jpg *_Photo1.jpgсделаете ли вы то, что хотите, с помощью одной команды?
@inkista ты опередил меня.
@scottbb, но не к ответу. :)
exittool в моем списке. Я просто хотел исчерпать себя, пытаясь сначала использовать exiv2. Большое спасибо за вклад.

Ответы (2)

exiv2кажется, действительно предпочитает, чтобы базовые имена файлов изображений и файлов sidecar/metadata совпадали. Вы можете автоматизировать (скрипт) создание/удаление копирования/переименования файлов метаданных, как у вас.

Однако для того, что вы хотите сделать, я настоятельно рекомендую использовать exiftool. Он более точно следует парадигме потока unix. Вы можете делать то, что хотите, используяexiftool следующую команду:

> exiftool -TagsFromFile Photo1.jpg *_Photo1.jpg
    2 image files updated

Это имеет то преимущество, что не нужно создавать файлы метаданных в качестве промежуточного шага; он просто копирует данные из Photo1.jpg в любой файл, соответствующий шаблону *_Photo1.jpg.

Иногда полезно иметь промежуточный файл, вы можете использовать его как источник информации в других инструментах :)
@RomeoNinov верно, но в этом случае при использовании exiv2промежуточные файлы нежелательны и требуют дополнительной работы. Отсюда и вопрос ОП. знак равно
Одна вещь, в которой я должен быть уверен, это то, насколько хорошо работает перевод из XML в IPTC и т. д. Я обнаружил одну гниду во время вчерашнего эксперимента, когда поле «Права» в XML оказалось пустым. Спасибо за все ответы... очевидно, что я разместил свой вопрос в нужном месте.

Вы пробовали так:

cat  Photo1.xml | exiv2 -i - thumb_Photo1.jpg

Эта команда отправит содержимое Photo1.xml в STDOUT, а следующая команда будет использовать его как STDIN и вставит в файл thumb_Photo1.jpg.

PS На справочной странице exiv2 я вижу такой пример:

exiv2 -e{tgt}- filename|xmllint .... | exiv2 -i{tgt}- filename
Спасибо Ромео. Я попробую это сегодня вечером. Насколько я понимаю, exiv2 не использует stdin, но все равно стоит попробовать. Спасибо.
@JSH, если вы посмотрите справочную страницу exiv2, вы увидите пример, где используются каналы (STDOUT | STDIN). Проверьте мой отредактированный ответ, пожалуйста
@RomeoNinov Я думаю, вы хотите использовать cat Photo1.xml | ...вместо echo Photo1.xml | .... Кроме того, это может квалифицироваться как « бесполезное использование кошек » или «жестокое обращение с кошками». =) Просто используйте перенаправление stdin:exiv2 -i - thumb_Photo1.jpg < Photo1.xml
@scottbb, правильно, моя ошибка, исправлю :) PS Я обожаю кота :D
Трубы. Да, я пропустил это. Попробую сегодня вечером. Спасибо.
Судя по их диалогу со мной в их системе отслеживания ошибок, трубы, похоже, находятся в стадии разработки в лагере разработчиков exiv2. У меня был хороший долгий разговор, в результате которого были запланированы некоторые улучшения. На данный момент у меня есть скрипт, который выполняет то, что мне нужно, с exiv2. Bash делает это достаточно просто.