atime, mtime, ctime - mit Zeitzone? Wenn ja, wie ändern?

#1645701
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.
#1645706
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.
Gast #1645716
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?
#1645729
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...
Gast #1645795
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>
#1645809
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 :-)
#1645843
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.
Gast #1645850
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..
#1645869
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
#1645881
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren