Kurze Frage: Steckt in den Zeitstempeln von Dateien eigentlich die Zeitzone mit drin? Wenn ja, wie kann man sie ändern?
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.
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.
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?
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...
Dochdoch, Linux, die Fotos sind jetzt auf einer ext3 Partition..
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
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>
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 :-)
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.
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.
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..
@ Hc Zimmerer: das geht so aber nur, wenn die resultierende Stunde im Bereich 0...23 bleibt!
Das würde mich aber arg wundern. Du hast das nicht ausprobiert? Also. Es wäre ein Bug in den fileutils.
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 |
geht: #! /bin/sh for i in all/*; do touch -m -d "$(stat -c %y "$i") + 3600 sec" "$i" done
na, es gibt ja nunmal keine stunde 25..
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!
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.
Ah, Du hast es auch so gemerkt. Gut. Da hätte ich mir Tipparbeit sparen können :).
schon gut... Ich hatte gedacht, du rechnest in sh einen neuen Wert für die Stunde aus und übergibst den an -d...
> 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
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.