ubuntuusers.de

'touch -d' zeigt seltsames Verhalten.

Status: Gelöst | Ubuntu-Version: Ubuntu GNOME 14.04 (Trusty Tahr)
Antworten |

sugarcube

Avatar von sugarcube

Anmeldungsdatum:
12. Januar 2007

Beiträge: 236

Wohnort: Willich

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!

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Mir scheint, das ist weder Bug noch Feature, sondern die Tücke des Objekts ...

  1. Das Problem mit solchen trickreich zusammengesetzten Datumsangaben tritt offensichtlich nicht nur bei touch auf, sondern genauso bei date

  2. Woran sich date verschluckt, ist offensichtlich die gemischte Reihenfolge von Datums- und Zeitblöcken. Sind die sinnvoll gruppiert, geht es nämlich:

track@track:~$ echo "$(date '+%Y/%m/%d %T' -r blubb ) -2 month"
2015/10/30 16:02:36 -2 month
track@track:~$ date --date "$(date '+%Y/%m/%d %T' -r blubb ) - 2 month"
Mo 30. Nov 19:02:36 CET 2015
track@track:~$ date --date "$(date '+%Y/%m/%d -2 month %T' -r blubb )"
So 30. Aug 16:02:36 CEST 2015
track@track:~$ date --date "$(date '+%T %Y/%m/%d' -r blubb ) -2 month"
So 30. Aug 16:02:36 CEST 2015
track@track:~$ touch --date "$(date '+%T %Y/%m/%d' -r blubb ) -2 month"  blubby
track@track:~$ date '+%T %Y/%m/%d' -r  blubby
16:02:36 2015/08/30 

Also: Datum zu Datum, und Zeit zu Zeit. (Stimmt nicht ganz, siehe mein Edit) - Dann geht es, sowohl mit date, als auch mit touch .


Edit: Ich glaube, es ist doch ein Feature, nur wir haben es nicht kapiert .... 😀

Wenn man nämlich mal genauer hinsieht, dann bemerkt man eine hübsche Regelmäßigkeit:

track@track:~$ date -d  "$(date '+%Y/%m/%d %T' -r blubb ) +4"
Fr 30. Okt 13:02:36 CET 2015
track@track:~$ date -d  "$(date '+%Y/%m/%d %T' -r blubb ) +4 days"
Sa 31. Okt 13:02:36 CET 2015
track@track:~$ date -d  "$(date '+%Y/%m/%d %T' -r blubb ) +0 +4 days"
Di 3. Nov 17:02:36 CET 2015 

Im Klartext: offenbar versteht er beim Standardformat die +1 oder -1 als Zeitzone für die Zeitangabe ! - und das "month" dahinter kommt dann als "+1 month" noch dazu.
... So viel zu der überbordenden Möglichkeiten bei diesen Befehlen, mit ihren Tücken.

LG,

track

sugarcube

(Themenstarter)
Avatar von sugarcube

Anmeldungsdatum:
12. Januar 2007

Beiträge: 236

Wohnort: Willich

Danke track!

Das war die Erleuchtung, die ich mir erhofft hatte! Es ist tatsächlich die Zeitzone, um die es hier geht. Man darf sie weglassen, und dann wird automatisch die nächste Zahl als Offset der UTC angenommen. Böse Falle das! Sollte vielleicht in der Doku ein Hinweis darauf stehen. Für alle, die sich mit dem Thema herumschlagen: Bei genauerem Studium wird man hier fündig. Ganz interessant fand ich auch timeanddate und Time zone Ambiguities.

Antworten |