it-swarm.com.de

Benennen Sie JPG-Dateien nach dem Erstellungsdatum um

Ich möchte alle Dateien in einem bestimmten Verzeichnis umbenennen. Umbenennen zu ihrem Erstellungsdatum.
Wenn meine Datei Image1.jpg ist, sollte sie in "Jan 16 12:09:42 2011.jpg" umbenannt werden.
Ich möchte dies über die Befehlszeile tun. Ich habe versucht: 

stat -f %SB Image0100.jpg

Aber wie kann ich das mit dem Befehl mv kombinieren? Und wie werde ich stat und mv durch die ganzen Dateien iterieren?
Oder gibt es einfache Möglichkeiten, alle Dateien mit ihrem Erstellungsdatum umzubenennen?

26
Neilvert Noval
jhead -n DSCN0382.JPG
DSCN0382.JPG --> 0408-150734.jpg

jedes strftime-Argument kann ebenfalls angegeben werden:

jhead -n%Y%m%d-%H%M%S *.jpg 

Dadurch werden Dateien, die mit * .jpg übereinstimmen, im Format JJJJMMTT-HHMMSS umbenannt

jhead -n%Y%m%d-%H%M%S DSCN0382.JPG
DSCN0382.JPG --> 20120408-150734.jpg

siehe auch die Manpage für viele andere coole Optionen. Sie können beispielsweise das EXIF-Datum korrigieren (verschieben). Dies ist sehr praktisch, wenn Sie Dateien verschiedener Kameras zusammenführen, wenn für einige Kameras eine falsche Zeit eingestellt ist.

55
Theo Band

Wenn Sie mit JPG arbeiten, das EXIF Daten enthält (z. B. von einer Digitalkamera), können Sie Folgendes verwenden, um das Erstellungsdatum anstelle von stat zu erhalten.

exif -t 0x9003 -m Image0100.jpg

Auf Anfrage ist hier der Befehl und die Ausgabe. Ein paar Punkte zu beachten:

  • Da nicht jede Datei Exif-Daten enthält, möchten wir prüfen, ob dst gültig ist, bevor Sie die restlichen Befehle ausführen. 
  • Die Ausgabe von Exif enthält ein Leerzeichen, das ein PITA für Dateinamen ist. Verwenden Sie sed, um es durch '-' zu ersetzen.
  • Beachten Sie, dass ich vor dem mv 'echo' verwende, um meine Skripts zu testen. Wenn Sie sich sicher sind, dass es das Richtige tut, können Sie das "Echo" entfernen ... Sie möchten nicht als der Kerl enden, der alle Dateien zerstört hat.

Befehl

for i in *.jpg; do
  dst=$(exif -t 0x9003 -m $i ) &&
  dst_esc=$(echo $dst | sed 's/ /-/g' ) &&
  echo mv $i $dst_esc.jpg
done

Ausgabe

'12379632.jpg' does not contain tag 'DateTimeOriginal'.
mv 15084688.jpg 2003:02:28-21:48:54.jpg
mv 15136312.jpg 2003:03:01-10:36:05.jpg
mv 15137960.jpg 2003:03:01-10:36:38.jpg
mv 15140744.jpg 2003:03:01-10:37:46.jpg
15
fseto
for file in *jpg
do
 newfile=$(date "+%b %d %H:%M:%S%Y $file" -d "$(stat -c "%y" $file)")
 mv "$file" "$newfile"
done$
5
ghostdog74

Die meisten POSIX-Dateisysteme zeichnen die Erstellungszeit nicht auf (und die API macht sie auch nicht sichtbar, selbst wenn sie aufgezeichnet wird), so dass Sie SOL sind.

Wenn Sie wie ich dies immer und immer wieder googeln müssen, weil Sie älter werden und sich nicht an Dinge erinnern können, können Sie auch gThumb verwenden, das einen Batch-Umbenenner enthält, der gut funktioniert und einen alten Namen hat -> neuer Name Vorschau. Wirklich nett.

1
three
$ for i in *; do mv "$i" "`stat -f %SB $i`"; done
1
DigitalRoss

Es gibt auch:

rename -v 's/.JPG/.jpeg/' *.JPG
rename -v 's/.jpeg/.jpg/' *.jpeg
exiv2 -r'RP_%Y%m%d_%H%M%S' rename *.jpg

b. RP_20120801_063021.jpg angeben. Dies funktioniert für Debian-Linuxes (z. B. Ubuntu). 

Die Umbenennungsbefehle gelten, wenn einige Bilder .JPG oder. Kann .JPG nicht direkt in .jpg konvertieren, da es als gleich interpretiert wird ...

1
xxjjnn
find . -type f | xargs stat -f "mv %%N \"%%SB.jpg\"" | awk -F \; '{system $1;}'
1
akond

Eine Perl-Alternative:

Ich mag das kurze Muster zum Hinzufügen eines festen String-Präfixes mit Perl sehr:

/bin/ls *.jpg | Perl -pe 's/.*/mv "$&" "prefix_$&"/' | sh

Um ein Datums-Präfix zu erstellen, ist es etwas komplizierter.

cat >t.pl

while(<*.jpg>) {
    $mtime = (stat($_))[9];
    ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($mtime);
    $year += 1900;
    ++ $mon;
    printf("mv \"%s\" \"%d-%.2d-%.2d-%s\"\n", $_, $year, $mon, $mday, $_)
}

Perl t.pl | sh
0
Curtis Yallop

Unter MacOS X 10.6.6 mit Bash (und, glaube ich, mit Korn Shell), funktioniert das bei Dateinamen mit Leerzeichen:

echo > "x y"
for file in *
do
    x=$(stat -f '%SB' -t '%Y%m%d.%H%M%S' "$file")
    mv "$file" "$x"
done

Für Datum und Uhrzeit wird auch die von ISO 8601 abgeleitete Notation verwendet. Wenn zwei Dateien dieselbe Änderungszeit haben, ist die letzte dieser Dateien in alphabetischer Reihenfolge die einzige, die überlebt. Dadurch wird auch kein Suffix verloren. Wenn Sie sich mit '.jpg'-Dateien beschäftigen, möchten Sie wahrscheinlich Folgendes verwenden:

echo > "x y,jpg"
for file in *.jpg
do
    x=$(stat -f '%SB' -t '%Y%m%d.%H%M%S.jpg' "$file")
    mv "$file" "$x"
done

Da der Ausgabename ($ x) keine Leerzeichen enthält, müssen die Anführungszeichen um "$ x" im Befehl "move" nicht verwendet werden, aber ihre Anwesenheit ist konsistent.

0

Verwenden Sie einfach exiftool . Hier ist ein Beispiel aus seiner Dokumentation :

   exiftool -r '-FileName<CreateDate' -d %Y-%m-%d/%H%M_%%f.%%e dir
        Both the directory and the filename may be changed together via the
        "FileName" tag if the new "FileName" contains a '/'.  The example above
        recursively renames all images in a directory by adding a "CreateDate"
        timestamp to the start of the filename, then moves them into new
        directories named by date.
0
tchrist