Ich importiere oft Fotos und Videos (meistens mit JPG- und MOV-Erweiterungen) von Digitalkameras und Tablets auf meinen PC, und ich möchte sie am liebsten sortiert nach Datum und Uhrzeit der Aufnahme sehen bereits in ihren EXIF-Daten vorhanden. Und daher mein Wunsch, sie alle umzubenennen vorzugsweise mit einem einfachen Nautilus-Skript indem vorzugsweise Datums- und Zeitstempel vor jedem Dateinamen eingefügt werden.
Ich habe es bisher nur geschafft, das folgende Nautilus-Skript zusammenzustellen, das meines Erachtens alles andere als perfekt ist:
for i in *.*
do
mv -i "$i" "$(exiftool -CreateDate "$i" | awk -F ': ' '{print $2}')_"$i""
done
Was mir an dieser Umbenennungsmethode nicht gefällt, sind die Doppelpunkte, die in EXIF-Datums- und Zeitstempeln verwendet werden (z. B. „2013:09:03 20:55:09_IMG_0108.JPG“), was zu Problemen führen kann, wenn diese Dateien später in andere Umgebungen (z. B. Windows) übertragen werden.
Dieser Befehl (unter Verwendung von exiv2 statt exiftool ) ermöglicht bequem die Manipulation von Datums- und Zeitstempeln, hat aber den Nachteil, dass es nicht mit Videodateien (z. B. MOV) funktioniert :
exiv2 -k -r '%Y-%m-%d_%H-%M-%S_:basename:' rename "$i"
Also hoffe ich, dass jemand eine bessere Lösung finden kann. Und es wäre magisch, wenn es sogar gelänge, die ursprünglichen Dateinamen und Erweiterungen auch in Kleinbuchstaben umzuwandeln!
Akzeptierte Antwort:
Was mir an dieser Umbenennungsmethode nicht gefällt, sind die Doppelpunkte, die in EXIF-Datums- und Zeitstempeln verwendet werden (z. B. Windows).
Sie könnten das Namensschema über sed
ausführen , um die Doppelpunkte durch Bindestriche und Leerzeichen durch Unterstriche zu ersetzen, etwa so:
mv -i "$i" "$(exiftool -CreateDate "$i" | awk -F ': ' '{print $2}' | sed -e 's/:/-/g' -e 's/ /_/g')_$i"
Um das Ganze in Kleinbuchstaben umzuwandeln, könnten Sie rename
verwenden :
rename 's/(.*)/\L$1/' file.JPG
## or
rename 's/(.*)/\L$1/' *.*
Oder Sie könnten es innerhalb Ihres Skripts mit sed
tun , wie in:
j=$(echo "$i" | sed -e 's/\(.*\)/\L\1/')
…und dann den $j
verwenden Variable anstelle des abschließenden $i
Ihres mv
Linie. Dieser sed-Weg ist etwas portabler (falls Ihnen das wichtig ist), da verschiedene Linux-Distributionen unterschiedliche Umbenennungsbefehle haben, während sed universell ist.
Alternativ kann das Skript auch wie folgt modifiziert werden, um die Umwandlung der Dateinamen in Kleinbuchstaben am Anfang mit tr
durchzuführen stattdessen:
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 die Umbenennung von MOV-Dateien mit CreateDate-Zeitstempeln BELIEBIG ANZAHL Stunden NACH ODER VOR JPG-Dateien angepasst, indem andere (-tur) EXIF-Daten verwendet und das Suffix dieses Zeitunterschieds entfernt werden, und es kann erforderlich sein, dies zu ändern -tur Teil entsprechend dem im System eingestellten Ort.