Des öfteren kommt man die die Verlegenheit, dass man eine Datei so umbenennen möchte, dass das Modifikationsdatum der Datei an den Namen angehängt wird. Zum Beispiel soll aus foo.bar die Datei foo.bar_2013-02-12 werden.
Jetzt kann man das natürlich so von Hand tippen, nach dem man sich mit ls -l
über das entsprechende Datum informiert hat. Man kann das aber auch die Shell machen lassen:
mv foo.bar foo.bar_`stat -c '%y' foo.bar | cut -f 1 -d " "`
Dabei muss man aber viel tippen und vor allem den Dateinamen gleich drei mal. Das geht auch anders:
THEFILE=foo.bar && mv $THEFILE ${THEFILE}_`stat -c '%y' $THEFILE | cut -f 1 -d " "`
Weiterhin viel Tipparbeit, daher bauen wir daraus am besten einen Alias. Allerdings kann man einem Alias keine Parameter übergeben, daher machen wir eine Funktion daraus und tragen das folgende in unsere bash.rc ein:
mvdate(){ mv $1 ${1}_`stat -c '%y' $1 | cut -f 1 -d " "`; }
Nun macht mvdate foo.bar
aus der Datei foo.bar die foo.bar_2013-02-12.
Manchmal habe ich auch das Bedürfnis, die Namen von Bild-Dateien von der einen Kamera in das Format einer anderen Kamera zu ändern, so dass alle Bilder chronologisch sortiert werden. D.h., ich möchte von IMG_1653.JPG nach IMG_20171103_093043000_1653.JPG umbenennen. Das ist etwas komplexer und geht dann so:
mvimg(){ mv $1 "IMG_`stat -c '%y' $1 | tr -d '-:' | tr ' ' '_' | cut -f 1 -d "."`000"${1#IMG}; }
So sieht der Aufruf mit einer Dateiendung aus (hier .zip) :
mvdate(){ mv $1 ${1}_`stat -c ‚%y‘ $1 | cut -f 1 -d “ „`“.zip“; }
Richtig funktioniert es nur so mit der Dateiendung .zip :
mv foo.bar foo_`stat -c ‚%y‘ foo.bar | cut -f 1 -d “ „`“.zip“