Das kleine Kommando ‚date‘ der Linux-Shell wird oft mächtig unterschätzt. Man kann das Ausgabeformat setzen und sogar das Datum relativ zum heutigen Tag bestimmen. Hierfür gibt es viele Anwendungsfälle:
# Datum ausgeben date Mon Mar 18 20:00:00 CET 2013
# Das Datum von gestern date -d "yesterday" Sun Mar 17 20:00:00 CET 2013
# Das Datum von vor 2 Tagen date -d "2 days ago" Sat Mar 16 20:00:00 CET 2013
# Das Datum im ISO-Format date +"%Y-%m-%d" 2013-03-18
Hier nun eine Kombination daraus:
# Das Datum von gestern im ISO-Format date +"%Y-%m-%d" -d "yesterday" 2013-03-17
Nun erzeugen wir einen Dateinamen:
date +"something-%Y-%m-%d.log" -d "yesterday" something-2013-03-17.log
Wenn wir den Namen in einer Variable benötigen:
FILENAME=$(date +"something-%Y-%m-%d.log" -d "yesterday") echo "$FILENAME"
Ein anderer Anwenungsfall: Bestimmen wir die Zeit zwischen 2 Zeitpunkten:
START=$(date "+%s") (do something) ENDE=$(date "+%s") let "DIFF = $ENDE - $START" echo "$DIFF Sekunden"
Nun erhalten wir die Zeit-Differenz in Sekunden. Aber was sagt uns schon 2800 Sekunden? Auch hier kann date helfen, die Zeit umzurechnen:
date -d "00:00:00 $DIFF seconds" "+%H:%M:%S" 00:46:40
Das obige Script lief also 46 Minuten und 40 Sekunden. So läßt sich dem nächtlichen Backup-Script schnell beibringen, wie es seine Laufzeit auszugeben hat.
Noch ein Trick: Mit folgendem Befehl kann man die 3 Variablen $DAY, $MONTH und $YEAR in einer Zeile setzen:
eval $(date "+DAY=%d; MONT=%m; YEAR=%Y")
Nun läßt sich mit ‚echo $YEAR‘, ‚echo $MONT‘ oder ‚echo $DAY‘ das Datum im Script abfragen.
Ach ja, wie alt bin ich eigentlich?
BIRTHDAY="1975-01-10" BDAY_SEC=$(date "+%s" -d "$BIRTHDAY") NOW_SEC=$(date "+%s") let "DIFF_SEC = $NOW_SEC - $BDAY_SEC" echo "Alter: $DIFF_SEC Sekunden" let "DIFF_DAYS = $DIFF_SEC / 60 / 60 / 24" echo "Alter: $DIFF_DAYS Tage"
Es gibt so viele Anwendungsfälle. Also, rettet das Datum! :-)
Mehr zum Thema date: hier