Wie benenne ich mehrere Fotos und Videos basierend auf EXIF-Daten um?

11

Ich importiere häufig Fotos und Videos (meistens mit JPG- und MOV-Erweiterungen) von Digitalkameras und Tablets auf meinen PC und möchte, dass sie nach den Daten und Zeiten sortiert werden, zu denen sie bereits in ihren EXIF-Daten enthalten waren. Und daher möchte ich sie alle vorzugsweise mit einem einfachen Nautilus-Skript umbenennen, indem ich vorzugsweise die Datums- und Zeitstempel vor jedem Dateinamen einfüge.

Ich habe es bisher nur geschafft, das folgende Nautilus-Skript zusammenzubringen, von dem ich glaube, dass es alles andere als perfekt ist:

for i in *.*
do
mv -i "$i" "$(exiftool -CreateDate "$i" | awk -F ': ' '{print $2}')_"$i"" 
done

Was mir bei dieser Umbenennungsmethode nicht gefällt, sind die in EXIF-Datums- und Zeitstempeln verwendeten Doppelpunkte (z. B. "2013: 09: 03 20: 55: 09_IMG_0108.JPG"), die Probleme beim späteren Übertragen dieser Dateien in andere Umgebungen verursachen können ( zB Windows).

Dieser Befehl (mit exiv2 anstelle von exiftool ) ermöglicht die bequeme Bearbeitung von Datums- und Zeitstempeln. Sein Nachteil ist jedoch, dass er bei Videodateien (z. B. MOV-Dateien) nicht funktioniert :

exiv2 -k -r '%Y-%m-%d_%H-%M-%S_:basename:' rename "$i"

Ich hoffe also, dass jemand eine bessere Lösung finden kann. Und es wäre magisch, wenn es sogar gelingen würde, die ursprünglichen Dateinamen und Erweiterungen auch in Kleinbuchstaben umzuwandeln!

Sadi
quelle
Zusätzlich zu den großartigen Antworten unten sollten Sie sich auch pyRenamer ansehen . Ich habe keine Erfahrung mit Videodateien (haben sie EXIF-Daten?), Aber ich kann sagen, dass es sich hervorragend für Fotos eignet. Es kann auch Dateierweiterungen in Kleinbuchstaben ändern.
Tom Brossman

Antworten:

6

Was mir bei dieser Umbenennungsmethode nicht gefällt, sind die in EXIF-Datums- und Zeitstempeln verwendeten Doppelpunkte (z. B. "2013: 09: 03 20: 55: 09_IMG_0108.JPG"), die Probleme beim späteren Übertragen dieser Dateien in andere Umgebungen verursachen können ( zB Windows).

Sie können das Namensschema durchlaufen sed, um die Doppelpunkte durch Bindestriche und Leerzeichen durch Unterstriche zu ersetzen:

mv -i "$i" "$(exiftool -CreateDate "$i" | awk -F ': ' '{print $2}' | sed -e 's/:/-/g' -e 's/ /_/g')_$i"

Um das Ganze in Kleinbuchstaben zu schreiben, können Sie Folgendes verwenden rename:

rename 's/(.*)/\L$1/' file.JPG
##  or
rename 's/(.*)/\L$1/' *.*

Oder Sie können dies in Ihrem Skript tun, indem Sie sedwie folgt vorgehen :

j=$(echo "$i" | sed -e 's/\(.*\)/\L\1/')

... und verwenden Sie dann die $jVariable anstelle des Finales $iIhrer mvZeile. Diese sed-Methode ist etwas portabler (wenn Ihnen das wichtig ist), da verschiedene Linux-Distributionen unterschiedliche Umbenennungsbefehle haben, während sed universell ist.

Alternativ kann das Skript wie folgt geändert werden, um zu Beginn eine Dateinamenkonvertierung in Kleinbuchstaben durchzuführen. Verwenden Sie trstattdessen Folgendes :

for arg 
do
  tmp="$(echo "$arg" | tr '[A-Z]' '[a-z]')"
  mv -i "$arg" "$(exiftool -CreateDate "$arg" | awk -F ': ' '{print $2}' | sed -e 's/:/-/g' -e 's/ /_/g')_$tmp"
done

Um leicht unterschiedliche Befehle für verschiedene Dateitypen auszuführen, kann in diesem Skript eine bash case-Anweisung verwendet werden. Zum Beispiel:

#! /usr/bin/env bash
for filename in ./*
do
  tmp="$(echo "$filename" | tr '[A-Z]' '[a-z]')"
  case "$filename" in
    *.MOV|*.mov) 
      mv -i "$filename" "$(exiftool -a -s -CreateDate-tur "$filename" | awk -F ': ' '{print $2}' | sed -e 's/\-[0-9][0-9]\:00//g' -e 's/\+[0-9][0-9]\:00//g' -e 's/:/-/g' -e 's/ /_/g')_$tmp"
      ;;
    *.JPG|*.jpg)
      mv -i "$filename" "$(exiftool -a -s -CreateDate "$filename" | awk -F ': ' '{print $2}' | sed -e 's/:/-/g' -e 's/ /_/g')_"$tmp""
      ;;
    *)
      echo 'Not a *.jpg or a *.mov!'
      ;;
  esac
done

In diesem Beispiel wird das Umbenennen von MOV-Dateien mit CreateDate-Zeitstempeln JEDER ANZAHL von Stunden NACH ODER VOR JPG-Dateien angepasst, indem andere (-tur) EXIF-Daten verwendet und dieses Zeitdifferenzsuffix entfernt werden. Möglicherweise muss -tur Teil geändert werden entsprechend dem im System eingestellten Ort.

Übelsuppe
quelle
Leider konnte ich nicht herausfinden, wie Dateinamen in Kleinbuchstaben konvertiert werden sollen, wie Sie vorschlagen (diese Zeile oben einfügen und die letzte ändern $i, $jum nichts zu tun). Stattdessen habe ich zu Beginn die Dateinamenkonvertierung in Kleinbuchstaben eingefügt und mir erlaubt, diese als weitere Option (die zumindest für mich funktioniert hat) am Ende Ihrer Antwort hinzuzufügen, damit ich Ihre Antwort akzeptieren kann. Natürlich können Sie Ihre Antwort nach Belieben weiter bearbeiten.
Sadi
@sadi Wenn ich es mit frischen Augen betrachte, kann ich sehen, was ich mit dem Befehl sed falsch gemacht habe. Die neueste Version wird funktionieren, aber wenn die tr-Methode für Sie funktioniert, ist das in Ordnung (ich habe den Verdacht, dass die tr-Lösung tatsächlich etwas effizienter ist, obwohl die sed-Lösung nicht-englische Zeichen besser
handhabt
Danke. Ich frage mich, ob Sie mir auch helfen können, dieses Skript weiter zu verbessern, indem Sie einen Befehl für MOV-Dateien und einen anderen für andere verwenden: if [die Erweiterung ist MOV] bla bla; sonst bla bla. Der Grund dafür ist, dass ich gerade festgestellt habe, dass der Stempel "CreateDate" in meinen MOV-Dateien (vom iPad) seltsamerweise +4 Stunden hat und ich eine andere Option (CreateDate-tur) verwenden muss, um eine genaue Reihenfolge von Fotos und Videos zu erreichen .
Sadi
Der beste Weg dafür (meiner Meinung nach) ist die Verwendung einer Fallbeschreibung; Hier ist etwas , um Ihnen den Einstieg zu erleichtern. Sie können auch eine if-Anweisung verwenden, case-Anweisungen können jedoch für zusätzliche Dateierweiterungen einfacher erweitert werden. Durchsuchen Sie das Internet nach "Bash Case Statement", um weitere Informationen zu erhalten.
Evilsoup
Tausend Dank!!! Ich werde diese Option auch zur Antwort hinzufügen, wenn Sie nichts dagegen haben.
Sadi
13

Ich musste meine Fotos umbenennen und fand diese Frage hier - ich habe gerade herausgefunden, dass exiftoolsie nativ behandelt wird:

Von http://www.sno.phy.queensu.ca/~phil/exiftool/filename.html

exiftool -d %Y-%m-%d_%H-%M-%S%%-c.%%e "-filename<CreateDate" DIR 

Wenn Sie den ursprünglichen Dateinamen verfolgen und die Erweiterung in Kleinbuchstaben schreiben möchten:

exiftool -d %Y%m%d_%H%M%S%%-c-%%f.%%le "-filename<DateTimeOriginal" [.|DIR]

Das gleiche funktioniert auch mit dem gesamten Dateinamen in Kleinbuchstaben:

exiftool -d %Y%m%d_%H%M%S%%-c-%%lf.%%le "-filename<DateTimeOriginal" [.|DIR]
DerekC
quelle
DIR muss der Ordner sein, in dem die Fotos zugeordnet sind. Wenn wir bereits ein Terminal im Ordner geöffnet haben, in dem wir den Befehl ausführen möchten, müssen wir DIR für ersetzen. Wenn Sie dem Dateinamen (dh IMG_) ein Präfix hinzufügen möchten, muss dieses ohne Anführungszeichen vor der Datumskette eingefügt werden. Hier ein Beispiel: exiftool -d IMG_% Y% m% d_% H% M% S %% - c. %% E "-Dateiname <CreateDate".
Nothor
2

Ich weiß, dass Sie gesagt haben, dass Sie ein Skript bevorzugen. Wenn Sie jedoch für eine kostenlose Java-Anwendung offen sind, können Sie AmoK Exif Sorter verwenden

Geben Sie hier die Bildbeschreibung ein

opticyclisch
quelle
1

Ich würde dafür verwenden krename. Es

  • zeigt Live-Vorschau
  • ermöglicht rückgängig machen
  • kann rekursiv in dir gehen
  • ermöglicht mehrere Umbenennungsmuster
  • Ermöglicht Globs und Regexps in Mustern
  • erinnert sich an die Geschichte
Adobe
quelle
0

Der Pyrenamer funktioniert auf meinem neu installierten Ubuntu 16.04 nicht, daher muss ich auch einen anderen Weg finden, um dieses Problem zu lösen.

Ich habe Dateien wie IMG_0001.JPG, IMG_0002.JPG, ... in einem Ordner. Überprüfen Sie diese Website unter /programming/917260/can-var-parameter-expansion-expressions-be-nested-in-bash

Installieren Sie zuerst "exiv2" und ich habe die folgende Befehlszeile geschrieben:

für img in $ (ls *. [Jj] [Pp] [Gg] 2> / dev / null); exiv2 -r '% Y% m% d_% H% M% S _' "$ (tmp = $ {img %%. *}; echo $ {tmp ## * _})" benenne "$ img" um; getan

Die Ausgabedateinamen lauten JJJJMMTT_HHMMSS_0001.JPG, JJJJMMTT_HHMMSS_0002.JPG usw. Selbst wenn die Fotos in derselben Sekunde aufgenommen wurden, macht die ursprüngliche Fotoseriennummer den Unterschied.

Chuck Lee
quelle