¿Cómo hago para que Exiv2 aplique metadatos de un archivo XML estático a varias imágenes?

Exiv2 parece funcionar bastante bien con las operaciones por lotes al mantener los archivos derivados generados con el mismo nombre de archivo raíz con una extensión diferente.

Mi misión es extraer la metainformación de un archivo jpg maestro y luego aplicarla a varias versiones más pequeñas existentes del archivo. Tengo...

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

En este momento, uso exiv2 para extraer la metainformación de Photo1.jpg, lo que da como resultado un archivo...

  Photo1.xml

Lo que me gustaría hacer a continuación es aplicar estos metadatos a la miniatura y los archivos de muestra. Con Exiv2 no puedo encontrar una manera de hacer que funcione con otra cosa que no sean archivos con los nombres base correspondientes. Por lo tanto, no puedo aplicar Photo1.xml a thumb_Photo1.jpg, solo Photo1.jpg.

Por el momento soluciono esto haciendo copias del archivo XML dejándome con esto...

  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

Una vez hecho esto, puedo ejecutar exiv2 para agregar etiquetas al pulgar y jpegs de muestra. Luego elimino los archivos XML, dejándome con tres archivos, todos etiquetados de manera idéntica.

Si bien lo anterior funciona muy bien, me pregunto si me he perdido una opción exiv2 oculta en lo profundo de la documentación que permite etiquetar un JPEG de un archivo XML con un nombre base diferente.

Um... ¿no exiftool -AllTagsFromFile=Photo1.jpg *_Photo1.jpgharías lo que quieres con un solo comando?
@inkista me ganaste en el golpe.
@scottbb pero no a una respuesta. :)
exittool está en mi lista. Solo quería agotarme tratando de usar exiv2 primero. Muchas gracias por la entrada.

Respuestas (2)

exiv2parece realmente preferir mantener los nombres base de los archivos de imagen y los archivos sidecar/metadatos coincidentes. Puede automatizar (guion) la creación/eliminación de copiar/cambiar el nombre de los archivos de metadatos como los que tiene.

Sin embargo, para lo que quiere hacer, le sugiero que use exiftool. Sigue el paradigma de flujo de Unix mucho más de cerca. Puedes hacer lo que quieras usandoexiftool con el siguiente comando:

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

Esto tiene la ventaja de no tener que crear los archivos de metadatos como un paso intermedio; simplemente copia los datos de Photo1.jpg en cualquier archivo que coincida con el patrón *_Photo1.jpg.

En algún momento es bueno tener un archivo intermedio, puede usarlo como fuente de información en otros instrumentos :)
@RomeoNinov cierto, pero en este caso, cuando se usan exiv2, los archivos intermedios no son deseables y requieren trabajo adicional. De ahí la pregunta del OP. =)
Una cosa de la que necesito estar seguro es qué tan bien funciona la traducción de XML a IPTC, etc. Encontré un nit en la experimentación de anoche donde el campo "Derechos" del XML terminó vacío. Gracias por todos los aportes hasta ahora... es obvio que publiqué mi pregunta en el lugar correcto.

Has probado de esta manera:

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

Este comando enviará el contenido de Photo1.xml a STDOUT y el siguiente comando lo usará como STDIN y lo insertará en el archivo thumb_Photo1.jpg.

PD En la página man de exiv2 veo este ejemplo:

exiv2 -e{tgt}- filename|xmllint .... | exiv2 -i{tgt}- filename
Gracias Romeo. Lo intentaré esta tarde. Según tengo entendido, exiv2 no usa stdin, pero es una buena idea intentarlo independientemente. Gracias.
@JSH, si revisa la página de manual de exiv2, verá un ejemplo donde se usan tuberías (STDOUT | STDIN). Revisa mi respuesta editada por favor
@RomeoNinov Creo que quieres usar cat Photo1.xml | ...en lugar de echo Photo1.xml | .... Además, esto calificaría como " Uso inútil del gato " o "abuso de gatos". =) Simplemente use la redirección stdin:exiv2 -i - thumb_Photo1.jpg < Photo1.xml
@scottbb, correcto, mi error, lo corregiré :) PD: Adoro a los gatos: D
Tubería. Sí, me perdí eso. Lo intentaré esta noche. Gracias.
Las tuberías parecen ser un trabajo en progreso en el campo de desarrollo de exiv2 según su diálogo conmigo en su sistema de seguimiento de errores. Tuve una buena conversación larga que resultó en la programación de algunas mejoras. Por el momento, tengo un script que realiza lo que necesito con exiv2. Bash lo hace razonablemente fácil.