Dateinamen auf Datum/Zeit aus EXIF Info setzen
Hallo Liste, ich habe hier leider schon wieder ein Problem zu lösen das meine script+tools Kenntnisse übersteigt... Ich habe eine Menge Fotos (.JPG) mit verschiedensten Dateinamen. Jetzt würde ich gerne die Dateien umbenennen und den Namen auf JJMMTT_HHMMSS.jpg setzen wobei dieser Zeitstempel aus den EXIF Informationen genommen werden soll. Wenn es nur ein paar Fotos sind mache ich es händisch. Ich öffne die Datei mit Gwenview, und benenne sie auf das um was mir Gwenview anzeigt. Aber jetzt habe ich ein paar hundert Fotos vor mir ...... lässt sich das irgendwie mit einem script machen? Grüße aus Wien bei "perfektem" Juli-Wetter (13° und Regen) Norbert -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am Sonntag, 24. Juli 2011, 19:30:18 schrieb Norbert Zawodsky:
Hallo Liste,
ich habe hier leider schon wieder ein Problem zu lösen das meine script+tools Kenntnisse übersteigt...
Ich habe eine Menge Fotos (.JPG) mit verschiedensten Dateinamen. Jetzt würde ich gerne die Dateien umbenennen und den Namen auf JJMMTT_HHMMSS.jpg setzen wobei dieser Zeitstempel aus den EXIF Informationen genommen werden soll.
Wenn es nur ein paar Fotos sind mache ich es händisch. Ich öffne die Datei mit Gwenview, und benenne sie auf das um was mir Gwenview anzeigt. Aber jetzt habe ich ein paar hundert Fotos vor mir ......
lässt sich das irgendwie mit einem script machen?
Grüße aus Wien bei "perfektem" Juli-Wetter (13° und Regen) Norbert
Das Kommandozeilentool, das die Daten ausliest, heißt bei mir (OSS 11.4) exif. Hier ist schon mal ein erster Ansatz. Wenn du im Ordner mit den Fotos bist, machst du: for foto in *;do exif --tag="Datum und Uhrzeit" $foto | grep "Value";done Das zeigt dir schon mal die Daten der Fotos an. Als Nächstes müsstest du mit sed oder awk oder einem anderen Tool die Datumszeile in die gewünschte Form umwandeln. Der Dateiname steht ja schon in der Variablen $foto, also kannst du daran anschließend gleich umbenennen. Vielleicht bringt dich das ja auf die richtige Fährte. Jürgen -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo, Am Sonntag, 24. Juli 2011, 19:30:18 schrieb Norbert Zawodsky:
Ich habe eine Menge Fotos (.JPG) mit verschiedensten Dateinamen. Jetzt würde ich gerne die Dateien umbenennen und den Namen auf JJMMTT_HHMMSS.jpg setzen wobei dieser Zeitstempel aus den EXIF Informationen genommen werden soll.
jhead - Digicam JPEG Exif header manipulation tool und so gehts: jhead -n%y%m%d_%H%M%S *.jpg This will rename files matched by *.jpg in the format YYMMDD_HHMMSS Die Option -te setzt sogar den Zeitstempel der Datei entsprechend. Jürgen -- Dr.rer.nat. Jürgen Vollmer, Viktoriastrasse 15, D-76133 Karlsruhe Tel: +49(721) 92 04 87 1 Fax: +49(721) 92 04 87 2 Juergen.Vollmer@informatik-vollmer.de www.informatik-vollmer.de ------------------------------------------------------------------------------- Diese EMail ist elektronisch mittels GPG / PGP signiert. Diese elektronische Unterschrift ist in einem EMail-Anhang enthalten. Leider kann die Signatur ohne die Installation entsprechender Programme weder geprüft noch angezeigt werden. Mehr dazu unter: http://www.gnupg.org oder auch http://www.pgpi.org -------------------------------------------------------------------------------
Am So, 24 Jul 2011 20:32:58 CEST schrieb Dr. Jürgen Vollmer:
Hallo,
Am Sonntag, 24. Juli 2011, 19:30:18 schrieb Norbert Zawodsky:
Ich habe eine Menge Fotos (.JPG) mit verschiedensten Dateinamen. Jetzt würde ich gerne die Dateien umbenennen und den Namen auf JJMMTT_HHMMSS.jpg setzen wobei dieser Zeitstempel aus den EXIF Informationen genommen werden soll.
jhead - Digicam JPEG Exif header manipulation tool
und so gehts:
jhead -n%y%m%d_%H%M%S *.jpg This will rename files matched by *.jpg in the format YYMMDD_HHMMSS
Die Option -te setzt sogar den Zeitstempel der Datei entsprechend.
Ist jhead verlustfrei? Ich denke da war mal was. Das hat mich aber nie interessiert, da ich komplexere Ansprüche habe und das mit der Bash realisiert habe. Mittlerweile denke ich, es hätte sich gelohnt, mein Script mit Perl zu beginnen, obwohl das damals "overkill" erschien, aber die Bedürfnisse wachsen. Das könnte auch reichen: http://www.sno.phy.queensu.ca/~phil/exiftool/#filename Al -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo, Am Sonntag, 24. Juli 2011, 20:56:26 schrieb Al Bogner:
Ist jhead verlustfrei? Ich denke da war mal was.
nun ja die Manual-Page schreibt nur etwas von EXIF-Sachen die manipuliert werden: jhead is used to display and manipulate data contained in the Exif header of JPEG images from digital cameras. By default, jhead displays the more useful camera settings from the file in a user-friendly format. jhead can also be used to manipulate some aspects of the image relating to JPEG and Exif headers, such as changing the internal timestamps, removing the thumbnail, or transferring Exif headers back into edited images after graphical editors deleted the Exif header. jhead can also be used to launch other programs, similar in style to the UNIX find command, but much simpler. insofern gehe ich davon aus, das am JPEG selbst nicht geändert wird. Bye Jürgen -- Dr.rer.nat. Jürgen Vollmer, Viktoriastrasse 15, D-76133 Karlsruhe Tel: +49(721) 92 04 87 1 Fax: +49(721) 92 04 87 2 Juergen.Vollmer@informatik-vollmer.de www.informatik-vollmer.de ------------------------------------------------------------------------------- Diese EMail ist elektronisch mittels GPG / PGP signiert. Diese elektronische Unterschrift ist in einem EMail-Anhang enthalten. Leider kann die Signatur ohne die Installation entsprechender Programme weder geprüft noch angezeigt werden. Mehr dazu unter: http://www.gnupg.org oder auch http://www.pgpi.org -------------------------------------------------------------------------------
Am So, 24 Jul 2011 21:46:53 CEST schrieb Dr. Jürgen Vollmer:
Hallo,
Am Sonntag, 24. Juli 2011, 20:56:26 schrieb Al Bogner:
Ist jhead verlustfrei? Ich denke da war mal was.
nun ja die Manual-Page schreibt nur etwas von EXIF-Sachen die manipuliert werden:
jhead is used to display and manipulate data contained in the Exif header of JPEG images from digital cameras. By default, jhead displays the more useful camera settings from the file in a user-friendly format.
jhead can also be used to manipulate some aspects of the image relating to JPEG and Exif headers, such as changing the internal timestamps, removing the thumbnail, or transferring Exif headers back into edited images after graphical editors deleted the Exif header. jhead can also be used to launch other programs, similar in style to the UNIX find command, but much simpler.
insofern gehe ich davon aus, das am JPEG selbst nicht geändert wird.
Es ist schon so viele Jahre her, dass das für mich mal ein Thema war, bei exiftool bin ich mir sicher, dass es nur die Metadaten ändert. Bei Imagemagick gibt es zB beim Löschen der Metadaten Verluste. Ich glaube mich nun zu erinnern, dass jhead verlustfrei ist. Das soll der OP selber recherchieren. Auf die Möglichkeit wurde ja hingewiesen. Es wäre auch zu testen, was jhead bei Dateien mit identer Zeit macht? Das kann zB auch leicht passieren, wenn man (bzw. die Familie) mit 2 oder mehreren Kameras fotografiert, bei denen die Zeit nicht exakt ident ist. Aus diesem Grund nummeriere ich auch innerhalb der Minute von 0-100 und nicht mit Sekunden. Da reicht dann weder jhead noch exiftool, sondern man braucht ein eigenes Script. Al -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am Sonntag, 24. Juli 2011, 20:32:58 schrieb Dr. Jürgen Vollmer:
Hallo,
Am Sonntag, 24. Juli 2011, 19:30:18 schrieb Norbert Zawodsky:
Ich habe eine Menge Fotos (.JPG) mit verschiedensten Dateinamen. Jetzt würde ich gerne die Dateien umbenennen und den Namen auf JJMMTT_HHMMSS.jpg setzen wobei dieser Zeitstempel aus den EXIF Informationen genommen werden soll.
jhead - Digicam JPEG Exif header manipulation tool
und so gehts:
jhead -n%y%m%d_%H%M%S *.jpg This will rename files matched by *.jpg in the format YYMMDD_HHMMSS
Die Option -te setzt sogar den Zeitstempel der Datei entsprechend.
sollte natürlich -ft heissen Bye Jürgen -- Dr.rer.nat. Jürgen Vollmer, Viktoriastrasse 15, D-76133 Karlsruhe Tel: +49(721) 92 04 87 1 Fax: +49(721) 92 04 87 2 Juergen.Vollmer@informatik-vollmer.de www.informatik-vollmer.de ------------------------------------------------------------------------------- Diese EMail ist elektronisch mittels GPG / PGP signiert. Diese elektronische Unterschrift ist in einem EMail-Anhang enthalten. Leider kann die Signatur ohne die Installation entsprechender Programme weder geprüft noch angezeigt werden. Mehr dazu unter: http://www.gnupg.org oder auch http://www.pgpi.org -------------------------------------------------------------------------------
Am 24.07.2011 20:32, schrieb Dr. Jürgen Vollmer:
Hallo,
Am Sonntag, 24. Juli 2011, 19:30:18 schrieb Norbert Zawodsky:
Ich habe eine Menge Fotos (.JPG) mit verschiedensten Dateinamen. Jetzt würde ich gerne die Dateien umbenennen und den Namen auf JJMMTT_HHMMSS.jpg setzen wobei dieser Zeitstempel aus den EXIF Informationen genommen werden soll.
jhead - Digicam JPEG Exif header manipulation tool
und so gehts:
jhead -n%y%m%d_%H%M%S *.jpg This will rename files matched by *.jpg in the format YYMMDD_HHMMSS
Die Option -te setzt sogar den Zeitstempel der Datei entsprechend.
BTW: Mit jhead kann man auch sehr elegant die EXIF-Zeiten in den Dateien manipulieren. Das ist nützlich, wenn die Zeit in der Kamera falsch eingestellt war und somit einen "generellen" offset hat: Bsp - Alle EXIF-Zeiten plus 1 Stunde und 30 Minuten jhead -ta+1:30:00 *.JPG Natürlich ist es sinnvoll, erst diesen Befehl auszuführen und dann den zum umbenennen der Dateien ... -- Herzliche Grüße Tao -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am 25.07.2011 12:49, schrieb Tao te Puh:
BTW: Mit jhead kann man auch sehr elegant die EXIF-Zeiten in den Dateien manipulieren. Das ist nützlich, wenn die Zeit in der Kamera falsch eingestellt war und somit einen "generellen" offset hat:
Bsp - Alle EXIF-Zeiten plus 1 Stunde und 30 Minuten jhead -ta+1:30:00 *.JPG
Natürlich ist es sinnvoll, erst diesen Befehl auszuführen und dann den zum umbenennen der Dateien ...
Danke für die vielen hilfreichen Antworten! "jhead" war mir am sympathischsten, ich habe es verwendet und es hat PERFEKT funktioniert. Außerdem ist mir noch ein cleveres Verhalten aufgefallen: Wenn sich beim umbenennen 2 Fotos mit dem selben Zeitstempel-Namen ergeben, dann hängt jhead selbstständig noch einen Buchstaben an. Es entsteht dann 1100725_141322.jpg 1100725_141322a.jpg 1100725_141322b.jpg usw ... praktisches Tool !! Grüße Norbert -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am So, 24 Jul 2011 19:30:18 CEST schrieb Norbert Zawodsky:
Hallo Liste,
ich habe hier leider schon wieder ein Problem zu lösen das meine script+tools Kenntnisse übersteigt...
Ich habe eine Menge Fotos (.JPG) mit verschiedensten Dateinamen. Jetzt würde ich gerne die Dateien umbenennen und den Namen auf JJMMTT_HHMMSS.jpg setzen wobei dieser Zeitstempel aus den EXIF Informationen genommen werden soll.
Wenn es nur ein paar Fotos sind mache ich es händisch. Ich öffne die Datei mit Gwenview, und benenne sie auf das um was mir Gwenview anzeigt. Aber jetzt habe ich ein paar hundert Fotos vor mir ......
lässt sich das irgendwie mit einem script machen?
Natürlich ;-) Das Mittel der Wahl ist Exiftool. Ich gebe dir mal ein paar Ansätze. Auf Zeilenumbrüche musst du selber achten. MYCREATEDATE=`exiftool -q -q -s -s -s -XMP:CreateDate "$ORIGINALFILE"` oder MYORIGINALDATE=`exiftool -q -q -s -s -s -EXIF:DateTimeOriginal "$ORIGINALFILE"` Eventuell kommt noch "-EXIF:CreateDate" zur Bestimmung des Datums in Frage. Meistens sind die 3 Datumsfelder aber ident. Als Ergebnis hast du dann zB "2005:06:21 18:20:37" Nun würde _ich_ das in einen "sauberen Dateinamen" bringen, also zB so: echo "$MYORIGINALDATE" | sed 's/[: ]//g' oder echo "$MYORIGINALDATE" | sed -e 's/://g' -e 's/ /_/g' Das kannst du dann gleich kombinieren und in eine Variable stecken, also zB MYCREATEDATE=`exiftool -q -q -s -s -s -XMP:CreateDate "$ORIGINALFILE" | sed -e 's/://g' -e 's/ /_/g'` Mit dieser Variable erstellst du dann eine weitere Variable NEWFILE. Ich schreibe da eine ganze Menge in den Dateinamen. Schau dir mal an was "exiftool -G -H -a $ORIGINALFILE" alles ausgibt. Meine Originaldatei sieht zB so aus: 100529_1642_sa_blueten.macro.digicam_k20-original.pef Datum_Uhrzeit_Wochentag_Thema_Quelle_Modell Die bearbeitete Datei ist dazu 100529_1642_sa_blueten_82kb_1.80_40.0am_c_800i_4340x_k20.jpg Datum_Uhrzeit_Wochentag_Thema_Geschwindigkeit_Blende_diverse Einstellungen_ISO_Auflösung_Modell Achtung, das kann ganz schön komplex werden und man muss _sehr_ aufpassen, dass man keine Fotos _verliert_. Denke daran, dass bei Serienaufnahmen mehrere Fotos in der selben Sekunde gemacht werden können! Ich helfe mir damit, dass ich das vorher prüfe und verschiebe dann die Zeit der Aufnahme um 1 Sekunde. Das kommt selten vor, aber es kommt vor! Siehe dazu: http://www.sno.phy.queensu.ca/~phil/exiftool/#shift Nun musst du nur mehr alle Fotos in einer Schleife abarbeiten. Das kannst du etwa so machen: find /fotos/ -type f -name '*.jpg' | sort | while read -r PICFILE; do mv -i "$ORIGINALFILE" "$NEWFILE" done
Grüße aus Wien bei "perfektem" Juli-Wetter (13° und Regen)
Hier kannst du eine Schneeballschlacht machen ;-) Al PS: Mal schauen, ob David was zu kritisieren hat ;-) -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo, Am Sun, 24 Jul 2011, Al Bogner schrieb:
PS: Mal schauen, ob David was zu kritisieren hat ;-)
Aber immer. Schließlich ist exiftool ein perlscript. Ergo sollte man selber als Script ein Perlscript schreiben, und darin direkt Image::ExifTool verwenden. exiftool ist nur ein CLI (Command Line Interface) zu Image::ExifTool. Das sollte man nie vergessen. Man lese also 'perldoc Image::ExifTool'. Wenn man scriptet, und wenn man via exiftool sowieso Perl verwendet, dann sollte man gleich alles in perl erledigen. per ``, qx, open, system kann man immer noch alles mache wie in der shell, meist gibt's aber effektiveres in perl. BTW: wenn man system verwendet, immer schön den Exitstatus abfragen. Mein "Wrapper" schaut so aus: ==== my $dry_run ||= 0; ### zu setzen via -s oder Getopt::* sub runcmd { my $ret = 0; if( ! $dry_run ) { system(@_); $ret = $?; ### hier ggfs. Sonderlocken für z.B. mkvmerge, antivir einfügen if( $ret == -1 ) { print STDERR "failed to execute: $!\n"; } elsif ($ret & 127) { printf STDERR "\nchild died with signal %d, %s coredump\n", ($ret & 127), ($ret & 128) ? "with coredump" : ""; } } else { print "\n+ ", join(" ", @_), "\n"; } return $ret == 0; } ==== Man muß nur noch darauf achten, ob man system via runcmd einen String ('runcmd("foo bar baz")') oder [besser] ein Array verfüttert ('runcmd("foo", "bar", "baz").). Siehe dazu 'perldoc -f system': ==== system LIST system PROGRAM LIST [..] Note that argument processing varies depending on the number of arguments. If there is more than one argument in LIST, or if LIST is an array with more than one value, starts the program given by the first element of the list with arguments given by the rest of the list. If there is only one scalar argument, the argument is checked for shell metacharacters, and if there are any, the entire argument is passed to the system's command shell for parsing (this is "/bin/sh -c" on Unix platforms, but varies on other platforms). If there are no shell metacharacters in the argument, it is split into words and passed directly to "execvp", which is more efficient. ==== Ist also durchaus sicherheitsrelevant! Die "Array" Variante ist immer vorzuziehen. -dnh --
Like the man said: "Nothing good ever goes in /opt." -- T. W. Foreman s/\/opt/\// -- P. L. Basilisk -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am Sonntag, 24. Juli 2011 schrieb Norbert Zawodsky:
ich habe hier leider schon wieder ein Problem zu lösen das meine script+tools Kenntnisse übersteigt...
Ich habe eine Menge Fotos (.JPG) mit verschiedensten Dateinamen. Jetzt würde ich gerne die Dateien umbenennen und den Namen auf JJMMTT_HHMMSS.jpg setzen wobei dieser Zeitstempel aus den EXIF Informationen genommen werden soll. (...).
AFAIK kann "krename" Dateien nach deren EXIF-Informationen umbenennen; es hat eine grafische Benutzeroberfläche. Gruß Jan -- Never try to outstubborn a cat. -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
participants (7)
-
Al Bogner
-
David Haller
-
Dr. Jürgen Vollmer
-
Jan Ritzerfeld
-
Juergen Langowski
-
Norbert Zawodsky
-
Tao te Puh