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.
exiv2
parece 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
.
exiv2
, los archivos intermedios no son deseables y requieren trabajo adicional. De ahí la pregunta del OP. =)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
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
entintador
exiftool -AllTagsFromFile=Photo1.jpg *_Photo1.jpg
harías lo que quieres con un solo comando?scottbb
entintador
JSH