Forum: PC Hard- und Software atime, mtime, ctime - mit Zeitzone? Wenn ja, wie ändern?


von Hansilein (Gast)


Lesenswert?

Kurze Frage: Steckt in den Zeitstempeln von Dateien eigentlich die 
Zeitzone mit drin? Wenn ja, wie kann man sie ändern?

von Klaus W. (mfgkw)


Lesenswert?

Du redest von Linux, nehme ich an?
Da gibt es eine interne Zeit, mit der das OS rechnet.
Traditionell ist das GMT.
An den Dateien klebt für die drei Zeiten jeweils
nur eine Zahl, nämlich die Anzahl Sekunden seit
dem Stichzeitpunkt 1.1.1970 00:00 GMT, also der Wert, den
time() damals jeweils geliefert hat.

Erst bei der Anzeige, z.B. mit ls oder anderen Programmen,
wird daraus etwas anderes.
Mit gmtime() kann man die Anzahl Sekunden in Datum und Zeit
für GMT bzw. UTC wandeln lassen, mit localtime() dagegen
in das gleiche Format, aber unter Berücksichtigung der
aktuellen Zeitzone des Benutzers bzw. des Prozesses und
ggf. der Sommerzeit.

von Klaus W. (mfgkw)


Lesenswert?

Nachtrag: nur so kann es übrigens funktionieren, daß
auf ein und demselben Rechner gleichzeitig ein Japaner,
ein Amerikaner und ein Deutscher angemeldet sind und für
eine bestimmte Datei mit ls -l jeweils die Änderungszeit
in ihrem lokalen Zeitsystem angezeigt bekommen.

von Hansilein (Gast)


Lesenswert?

Ja, Linux. Ich frage, weil ich Bilddaten aus einer anderen Zeitzone 
habe, die etwas durcheinandergeraten sind. Ich möchte die Zeitstempel 
auf Ortszeit ändern (der Zeitstempel des Fotos einer Mittags 
fotografierten Uhr soll 1200 sein). Dann kann ich also die lokale 
Anzeige der Zeitzone ignorieren, es würde reichen den Zeitstempel um die 
Differenz der Zeitzonen zu ändern.
Weisst Du zufällig, wie man eine solche relative Änderung durchführen 
kann?

von Klaus W. (mfgkw)


Lesenswert?

Dann geht es wahrscheinlich nicht um ein Unix-artiges Dateisystem,
sondern FAT (Speicherkarte eines Fotos)?
Dann gilt eh nicht, ewas ich ssagte, sondern da kocht jeder sein
Süppchen. Wahrscheinlich wurde einfach vom Foto dessen lokale
Zeit gespeichert.
Dann gibt es keine aber auch drei Zeiten: atime, ctime, mtime...

von Hansilein (Gast)


Lesenswert?

Dochdoch, Linux, die Fotos sind jetzt auf einer ext3 Partition..

von B. M. (Gast)


Lesenswert?

Du suchst wahrscheinlich hier nach:

man touch

Ansonsten gilt das bereits gesagte, Linux-Maschinen rechnen mit 
Unixtime:

1269292872 -> Mon Mar 22 16:21:12 2010

von Hansilein (Gast)


Lesenswert?

touch kann anscheinend leider kein offset zur mtime machen, sondern nur 
zur systemzeit.

Mit der shell fällt mir momentan nur ein unixtime auslesen, h*3600 
addieren, zurückschreiben..

Oder 'richtig' programmieren?

mtime [-]yyyymmddhhmmss <file>

von Klaus W. (mfgkw)


Lesenswert?

atime wurde dann aber beim Kopieren dazugelogen, weil es
auf FAT gar nicht gespeichert wird, aber egal.

Eine einfache Variante nur in der Konsole fällt mir spontan auch
nicht ein.
In der Tat kann man das Datum+Zeit mit touch setzen.
Das Problem ist die Rechnerei in der Konsole.
Mit stat könnte man sich den Zeitstempel holen, auch in
der Sekundenform.
Mit sh-Mimik könnte man zu dem Wert etwas addieren oder subtrahieren.
Das Problem wird aber, diesen korrigierten Sekundenwert dann zu
setzen - touch braucht die explizite Angabe von h, min, sec etc..

Wahrscheinlich würde ich mir ein kleines C-Programm, das
für eine Datei aufgerufen wird, schreiben.
Das müsste folgendes tun:
1. Zeit der Datei holen im time-Format mit stat()
2. Aufbrechen der Zeit in Tag, Monat, Jahr, h, min, sec etc. mit
   gmtime()
3. Zu den Sekunden oder Minuten oder Stunden passende Werte
   addieren (darf "blödsinnige" Zeiten geben, z.B. Minuten
   unter 0 oder über 60)
4. zurück konvertieren in die Sek. seit 1970 mit mktime()
   (die "blödsinnigen" Werte werden dabei korrekt verwurstet)
5. Zurückschreiben des Wertes mit utime()

Die Schritte 2...4 könnte man durch einfaches Addieren bzw.
Subtrahieren der Sekunden ersetzen, wenn man das illegale Wissen
hätte, dass es sich bei dem Wert einfach um die Sekunden seit...
handelt :-)

von Klaus W. (mfgkw)


Lesenswert?

PS: dieses Programm würde ich der Einfachheit halber nur für
ein Programm stricken, dessen Name aus den Argumenten kommt,
und die Schleife über die Dateien dann in der sh machen, das
spart Arbeit im Programm.

von Hc Z. (mizch)


Lesenswert?

Um alle Dateien im laufenden Verzeichnis eine Stunde später zu setzen:
1
for i; do
2
  touch -d "$(stat -c %y "$i") + 3600 sec" "$i"
3
done

(GNU touch und GNU date vorausgesetzt.)

EDIT:  Bitte erst an einem Verzeichnis ausprobieren, in dem die 
Zeitstempel kaputt gehen dürfen.  atime (%x) durch %y ersetzt.

von Hansilein (Gast)


Lesenswert?

habe mir auch gerade was in python gebastelt:

#! /usr/bin/env python

#~ 
http://stackoverflow.com/questions/1158076/implement-touch-using-python
#~ http://docs.python.org/library/os.html

import sys, os

def touch(fname, times = None):
    with file(fname, 'a'):
        os.utime(fname, times)

if _name_ == "__main__":
    fname, delta = sys.argv[1:]
    statinfo = os.stat(fname)
    times = (int(statinfo.st_atime), int(statinfo.st_mtime) + 
int(delta))
    touch(fname, times)

mizchs vorschlag probier ich jetzt mal..

von Klaus W. (mfgkw)


Lesenswert?

@ Hc Zimmerer:
das geht so aber nur, wenn die resultierende Stunde im Bereich
0...23 bleibt!

von Hc Z. (mizch)


Lesenswert?

Das würde mich aber arg wundern.  Du hast das nicht ausprobiert? 
Also.  Es wäre ein Bug in den fileutils.

von Klaus W. (mfgkw)


Lesenswert?

Wieso Bug?
mit touch -d ... setzt man eine Zeit, und wenn nur eine Zahl
angegeben ist, dann ist das die Stunde.
1
klaus@a64a:~ > touch -d 23 t.c
2
klaus@a64a:~ > ls -l t.c
3
-rw-r----- 1 klaus users 2415 22. Mär 23:00 t.c
4
klaus@a64a:~ > touch -d 25 t.c
5
touch: Ungültiges Datumsformat „25“
6
klaus@a64a:~ > ls -l t.c
7
-rw-r----- 1 klaus users 2415 22. Mär 23:00 t.c

von Hansilein (Gast)


Lesenswert?

geht:

#! /bin/sh
for i in all/*; do
  touch -m -d "$(stat -c %y "$i") + 3600 sec" "$i"
done

von Hansilein (Gast)


Lesenswert?

na, es gibt ja nunmal keine stunde 25..

von Hansilein (Gast)


Lesenswert?

also danke für die hilfe

von Klaus W. (mfgkw)


Lesenswert?

oh sorry, ich wusste nicht, daß man bei -d einen Rechenausdruck angeben 
kann.
Falls das so ist, nehme ich alles wieder zurück.
Dann ist das ja wirklich die einfache Lösung!

von Hc Z. (mizch)


Lesenswert?

Du hast nicht verstanden, was das Shellscript macht.  Du solltest im 
Manual nachschlagen was eine Ausdruck mit "Datum + Zeit" macht, denn das 
steht auf der Kommandozeile, wenn Du sie nachvollziehen würdest.  Ein 
solcher Ausdruck ergibt volle Datumsarithmetik.

Nirgends in meinem Shellskript wird '25' stehen.  Bitte erst denken und 
dann maulen.

von Hc Z. (mizch)


Lesenswert?

Ah, Du hast es auch so gemerkt.  Gut.  Da hätte ich mir Tipparbeit 
sparen können :).

von Klaus W. (mfgkw)


Lesenswert?

schon gut...
Ich hatte gedacht, du rechnest in sh einen neuen Wert für die Stunde aus
und übergibst den an -d...

von Hansilein (Gast)


Lesenswert?

> oh sorry, ich wusste nicht, daß man bei -d einen Rechenausdruck angeben
kann.
Das habe ich in der Doku auch noch nicht gesehen:
http://www.gnu.org/software/coreutils/manual/coreutils.html#Date-input-formats

von Klaus W. (mfgkw)


Lesenswert?

ah, aber Danke für den Link!

Da sehe ich doch kurz dahinter bei 28.8, daß man mit einem
vorangestellten @ eine absolute Zeit als Sekunden seit 1970
angeben kann!
Das gefällt mir.

von Hc Z. (mizch)


Lesenswert?

Klar, könnte sein.  Auch ich baue manchmal Mist, aber solchen doch eher 
nicht.  Begraben wir's und schön, dass es funktioniert, wie der TE es 
sich gewünscht hat.

von Hansilein (Gast)


Lesenswert?

Es steht doch in der Doku:
"Relative items adjust a date (or the current date if none) forward or 
backward. The effects of relative items accumulate."

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.