Hallo alle,
ich schreibe gerade an einem Script, dass auf der Kommandozeile komfortabel atime und mtime beliebiger Dateien relativ zu ihren aktuellen timestamps verändern soll. Dabei bin ich auf ein seltsames Verhalten von 'touch --date' gestoßen, dass ich mir nicht erklären kann. Wenn ich die Doku unter GNU-Coreutils-Date input formats richtig verstanden habe, ist ein Befehl wie
1 | "date --date="$(date +%Y-%m-15) -1 month" +'Last month was %B!'" |
erlaubt. In GNU-Coreutils-Change file timestamps wird beim Parameter '--date' auf die Seite zu den Eingabeformaten verwiesen. Ich habe deshalb angenommen, dass 'touch -d' die gleichen Eingabeformate erlaubt, wie 'date -d'. Als ich mein Script getestet habe, ist mir aber aufgefallen, dass negative Vorzeichen (Wie oben bei '-1 month') nicht zum gewünschten Ergebnis führen. Auf meiner Maschine werden sie ignoriert. Jetzt ist die Wahrscheinlichkeit natürlich hoch, dass der Fehler vor dem Computer sitzt, aber ich komme einfach ncht auf den Grund für das Verhalten.
Zunächst einmal die Ausgabe des obigen Beispiels aus der Coreutils-Doku:
1 2 | thomas@tomscomp2:~/temp/test$ date --date="$(date +%Y-%m-15) -1 month" +'Last month was %B!' Last month was Mai! |
Jippi! Es klappt Und jetzt das Ganze mit 'touch' Ich schreibe in die Ausgabe, worauf es mir ankommt, damit gleich zu sehen ist wo ich stolpere.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | thomas@tomscomp2:~/temp/test$ date '+%Y/%m/%d %T' -r DSCF2002.JPG #wir starten mit der Ausgabe des aktuellen Datumswertes 2016/06/03 09:00:00 # ok, 06 also Juni # Jetzt versuche ich das Datum um einen Monat in die Vergangenheit zu setzen. # Über -d gebe ich das zu verwendende Datum 3.Mai an! thomas@tomscomp2:~/temp/test$ touch -d "2016-05-03 06:00:00 -1 month" DSCF2002.JPG thomas@tomscomp2:~/temp/test$ date '+%Y/%m/%d %T' -r DSCF2002.JPG 2016/06/03 09:00:00 #Hoppla! Juni, erwartet hatte ich aber April # Jetzt das Ganze mit '1 month ago' thomas@tomscomp2:~/temp/test$ touch -d "2016-05-03 06:00:00 1 month ago" DSCF2002.JPG thomas@tomscomp2:~/temp/test$ date '+%Y/%m/%d %T' -r DSCF2002.JPG 2016/04/03 06:00:00 # Genau das erwartete Ergebnis # Und das geht auch mehrmals: es wird wirklich der übergebene String verwendet. thomas@tomscomp2:~/temp/test$ touch -d "2016-04-03 06:00:00 1 month ago" DSCF2002.JPG thomas@tomscomp2:~/temp/test$ date '+%Y/%m/%d %T' -r DSCF2002.JPG 2016/03/03 06:00:00 # Aber wenn ich '-1 month' verwende wird das negative Vorzeichen ignoriert. thomas@tomscomp2:~/temp/test$ touch -d "2016-03-03 06:00:00 -1 month" DSCF2002.JPG thomas@tomscomp2:~/temp/test$ date '+%Y/%m/%d %T' -r DSCF2002.JPG 2016/04/03 09:00:00 # in die Zukunft kann man mit Vorzeichen aber zählen. thomas@tomscomp2:~/temp/test$ touch -d "2016-04-03 06:00:00 +1 month" DSCF2002.JPG thomas@tomscomp2:~/temp/test$ date '+%Y/%m/%d %T' -r DSCF2002.JPG 2016/05/03 07:00:00 thomas@tomscomp2:~/temp/test$ touch -d "2016-05-03 06:00:00 1 month" DSCF2002.JPG thomas@tomscomp2:~/temp/test$ date '+%Y/%m/%d %T' -r DSCF2002.JPG 2016/06/03 06:00:00 #Nur noch der Vollständigkeit halber: Das Datum der Datei als Ausgangsbasis statt eines Strings thomas@tomscomp2:~/temp/test$ touch --date="$(date '+%Y/%m/%d %T' -r DSCF2002.JPG) -1 month" DSCF2002.JPG thomas@tomscomp2:~/temp/test$ date '+%Y/%m/%d %T' -r DSCF2002.JPG 2016/07/03 09:00:00 # Gleicher Effekt. |
Ist das jetzt ein Fehler oder ist das ein Feature? Bitte helfe mir jemand auf dem Weg zur Erleuchtung!