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?
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.
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:
dst
gültig ist, bevor Sie die restlichen Befehle ausführen. 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
'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
for file in *jpg
do
newfile=$(date "+%b %d %H:%M:%S%Y $file" -d "$(stat -c "%y" $file)")
mv "$file" "$newfile"
done$
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.
$ for i in *; do mv "$i" "`stat -f %SB $i`"; done
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 ...
find . -type f | xargs stat -f "mv %%N \"%%SB.jpg\"" | awk -F \; '{system $1;}'
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
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.
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.