Wie bringe ich Exiv2 dazu, Metadaten aus einer statischen XML-Datei auf mehrere Bilder anzuwenden?

Exiv2 scheint mit Batch-Operationen recht gut zu funktionieren, indem alle generierten abgeleiteten Dateien den gleichen Stammdateinamen mit einer anderen Erweiterung beibehalten.

Meine Mission ist es, die Metainformationen aus einer Master-JPG-Datei zu ziehen und sie dann auf mehrere vorhandene kleinere Versionen der Datei anzuwenden. Ich habe...

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

Im Moment verwende ich exiv2, um die Metainformationen aus Photo1.jpg herauszuziehen, was zu einer Datei führt ...

  Photo1.xml

Als Nächstes möchte ich diese Metadaten auf die Miniaturansichts- und Beispieldateien anwenden. Mit Exiv2 finde ich keine Möglichkeit, es mit etwas anderem als Dateien mit entsprechenden Basisnamen zum Laufen zu bringen. Daher kann ich Photo1.xml nicht auf thumb_Photo1.jpg anwenden, sondern nur auf Photo1.jpg.

Im Moment umgehe ich das, indem ich Kopien der XML-Datei anfertige und mir das hier belasse ...

  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

Wenn dies erledigt ist, kann ich dann exiv2 ausführen, um dem Daumen und den Beispiel-JPEGs Tags hinzuzufügen. Danach lösche ich die XML-Dateien und hinterlasse drei Dateien, die alle identisch getaggt sind.

Obwohl das obige sehr gut funktioniert, frage ich mich, ob ich eine exiv2-Option verpasst habe, die tief in der Dokumentation vergraben ist und es einem ermöglicht, ein JPEG aus einer XML-Datei mit einem anderen Basisnamen zu markieren.

Ähm... würdest exiftool -AllTagsFromFile=Photo1.jpg *_Photo1.jpgdu nicht mit einem einzigen Befehl tun, was du willst?
@inkista du bist mir zuvorgekommen.
@scottbb aber nicht auf eine Antwort. :)
exittool ist auf meiner Liste. Ich wollte nur versuchen, zuerst exiv2 zu verwenden. Vielen Dank für die Eingabe.

Antworten (2)

exiv2scheint es wirklich vorzuziehen, die Basisnamen von Bilddateien und Sidecar-/Metadatendateien übereinstimmend zu halten. Sie könnten das Erstellen/Löschen des Kopierens/Umbenennens der Metadatendateien wie bei Ihnen automatisieren (Skript).

Für das, was Sie tun möchten, würde ich jedoch dringend empfehlen, exiftool. Es folgt dem Unix-Stream-Paradigma viel genauer. Sie können mit dem folgenden Befehl tun, was Sie wollen :exiftool

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

Dies hat den Vorteil, dass die Metadatendateien nicht als Zwischenschritt erstellt werden müssen; es kopiert lediglich die Daten von Photo1.jpg in eine beliebige Datei, die dem Muster entspricht *_Photo1.jpg.

Manchmal ist es gut, eine Zwischendatei zu haben, Sie können sie als Informationsquelle in anderen Instrumenten verwenden :)
@RomeoNinov stimmt, aber in diesem Fall sind exiv2die Zwischendateien bei der Verwendung unerwünscht und erfordern zusätzliche Arbeit. Daher die Frage des OP. =)
Eine Sache, bei der ich sicher sein muss, ist, wie gut die Übersetzung von XML nach IPTC usw. funktioniert. Ich habe bei den Experimenten gestern Abend einen Fehler gefunden, bei dem das Feld "Rechte" des XML leer endete. Vielen Dank für alle bisherigen Beiträge ... es ist offensichtlich, dass ich meine Frage an der richtigen Stelle gepostet habe.

Hast du es mal so versucht:

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

Dieser Befehl sendet den Inhalt von Photo1.xml an STDOUT und der nächste Befehl verwendet ihn als STDIN und fügt ihn in die Datei thumb_Photo1.jpg ein.

PS In der Manpage von exiv2 sehe ich dieses Beispiel:

exiv2 -e{tgt}- filename|xmllint .... | exiv2 -i{tgt}- filename
Danke Romo. Das werde ich heute Abend versuchen. So wie ich es verstehe, verwendet exiv2 stdin nicht, aber es ist eine gute Idee, es trotzdem zu versuchen. Vielen Dank.
@JSH, wenn Sie die Manpage von exiv2 überprüfen, sehen Sie ein Beispiel, wo Rohre verwendet werden (STDOUT | STDIN). Überprüfen Sie bitte meine bearbeitete Antwort
@RomeoNinov Ich denke, du meinst cat Photo1.xml | ...statt echo Photo1.xml | .... Auch dies würde als „ unnützer Einsatz von Katzen “ oder „Katzenmissbrauch“ qualifiziert. =) Verwenden Sie einfach die stdin-Umleitung:exiv2 -i - thumb_Photo1.jpg < Photo1.xml
@scottbb, richtig, mein Fehler, wird es korrigieren :) PS Ich verehre Katze: D
Rohre. Ja das habe ich vermisst. Werde es heute Abend ausprobieren. Vielen Dank.
Laut ihrem Dialog mit mir in ihrem Fehlerverfolgungssystem scheinen Pipes im Exiv2-Entwicklungslager in Arbeit zu sein. Ich hatte ein gutes langes Gespräch, das dazu führte, dass einige Verbesserungen geplant wurden. Im Moment habe ich ein Skript, das mit exiv2 ausführt, was ich brauche. Bash macht dies ziemlich einfach.