Hallo Forum,
ich suche mir gerade einen Wolf. Ich möchte gerne von Dateien in einem Verzeichnis die Zeiten ermitteln, zu denen diese Dateien ursprünglich erzeugt wurden. Die Dateien kommen von FreeBSD und wurden nach Mac OS X kopiert.
Mit os.path.getctime() resp. os.stat() gelange ich stets nur an das Datum der letzten Modifizierung, so wie es auch in der Doku bezüglich UNIX steht. OS X kann aber sowohl im Finder als auch in der Konsole das Erstellungsdatum sehr wohl korrekt anzeigen, d.h. die Informationen sind vorhanden. Nur, wie komme ich dran?
Gruß
kbr
Wie kann ich die file creation time ermitteln
Ich würde sagen, der Finder betrügt dich. Wenn ich eine Datei neu erzeuge, sind "Erstellt" und "Geändert" gleich. Ändere ich eine Minute später die Datei, ist auch das "Erstellt"-Datum anders und beide Daten sind wieder gleich.
So wie ich das verstanden hatte, konnte der Mac vor OS/X man diese beiden Daten unterscheiden, doch mit der Unixifizierung durch OS/X ist das für das n un verwendete Dateisystem unter den Tisch gefallen. Das gibt da im Web lange Diskussionen dazu, ob es solches Datum überhaupt sinnvoll ist, wie man es beim Kopieren von Dateien zu interpretieren hat usw. Wollte ich jetzt nicht alles lesen.
Stefan
So wie ich das verstanden hatte, konnte der Mac vor OS/X man diese beiden Daten unterscheiden, doch mit der Unixifizierung durch OS/X ist das für das n un verwendete Dateisystem unter den Tisch gefallen. Das gibt da im Web lange Diskussionen dazu, ob es solches Datum überhaupt sinnvoll ist, wie man es beim Kopieren von Dateien zu interpretieren hat usw. Wollte ich jetzt nicht alles lesen.
Stefan
Das ist nicht ganz korrekt. Vielleicht liegt es an deinem Programm, dass die Datei statt sie zu ändern neu anlegt? Bei mir(Textmate) geht es zumindest.sma hat geschrieben:Ich würde sagen, der Finder betrügt dich. Wenn ich eine Datei neu erzeuge, sind "Erstellt" und "Geändert" gleich. Ändere ich eine Minute später die Datei, ist auch das "Erstellt"-Datum anders und beide Daten sind wieder gleich.
@kbr: Am nimmst du dazu das Cocoa-Framework.
Code: Alles auswählen
from Foundation import NSURL, NSURLCreationDateKey
url = NSURL.fileURLWithPath_("/irgendeine/datei")
success, creation_date, error = url.getResourceValue_forKey_error_(None, NSURLCreationDateKey, None)
Geht so allerdings glaube ich nur bei Snow Leopard. Dafür brauchst du dann die aktuellste Version von pyobjc(nicht die, die bei Snow Leopard dabei ist), da du die Konstante NSURLCreationDateKey sonst nicht hast.
Alternativ nimmst du einfach den String "NSURLCreationDateKey", statt der Konstanten.
Bei weiteren Fragen: Die Apple-Doku ist klasse.
Diese Idee wäre naheliegend. Aber auch wenn ich Dateien ändere, bleibt der Finder bei seiner Aussage und ich bekomme in der Konsole mit ls -l bzw. ls -Ul die korrekten Modifizierungs- bzw. Erstellungszeiten angezeigt; sowohl unter OS X als auch bei FreeBSD.sma hat geschrieben:Ich würde sagen, der Finder betrügt dich.
Danke für den konstruktiven Hinweis. Aber ich möchte gerne plattformunabhängig bleiben, da das Script später auch unter FreeBSD laufen soll. Ich habe mir jetzt erstmal durch einen Workaround geholfen, bei dem dieses Datum nicht verwendet wird.Darii hat geschrieben:Am nimmst du dazu das Cocoa-Framework
Schade, dass nicht alle Informationen, die per "ls" verfügbar sind, auch mit dem os-Modul abgerufen werden können. Falls es doch eine Lösung gibt, würde dies mich immer noch interessieren.
Danke für die Antworten,
Klaus
Ich weiß nicht, ob ich Dich richtig verstehe, aber eine "Erstellungszeit" kennt Unix im Allgemeinen nicht, deswegen verträgt sich der Anspruch, diese Zeit auslesen zu wollen, nicht mit dem Anspruch der Plattformunabhängigkeit. Unix kennt nur Zeitstempel für den letzten Zugriff, die letzte Veränderung und die letzte Änderung an den Metadaten, und an diese drei Zeitstempel kommt man auch über "os.stat()" heran. Alles darüber hinausgehende ist plattformabhängig.
Zumindest unter FreeBSD aber gibt es "os.stat(…).st_birthtime", was laut Dokumentation die Zeitpunkt der Erstellung angibt.
Zumindest unter FreeBSD aber gibt es "os.stat(…).st_birthtime", was laut Dokumentation die Zeitpunkt der Erstellung angibt.
lunar hat geschrieben:Ich weiß nicht, ob ich Dich richtig verstehe, aber eine "Erstellungszeit" kennt Unix im Allgemeinen nicht, deswegen verträgt sich der Anspruch, diese Zeit auslesen zu wollen, nicht mit dem Anspruch der Plattformunabhängigkeit. Unix kennt nur Zeitstempel für den letzten Zugriff, die letzte Veränderung und die letzte Änderung an den Metadaten, und an diese drei Zeitstempel kommt man auch über "os.stat()" heran. Alles darüber hinausgehende ist plattformabhängig.
Ich denke, Du hast mich richtig verstanden und es handelt sich bei dem was ich wollte wohl tatsächlich um eine Information, die plattformunabhängig nicht verfügbar zu sein scheint. Allerdings geben die manpages von OS X und FreeBSD für die Oprtion -U von ls übereinstimmend an, den Zeitpunkt der "file creation" statt "last modification" zu verwenden. Eine "Erstellungszeit" scheinen diese beiden OSs zu kennen und sie scheint auch bei der Übertragung zwischen den beiden Systemen erhalten zu bleiben.
Sorry, hatte vergessen zu schreiben, dass ich dies bereits versucht hatte; zumindest auf meiner Installation (7.2) wird dieses Attribut nicht gesetzt (auch nicht, wenn ich das Skript als root laufen lasse). Ohne diskutieren zu wollen, ob es sinnvoll ist, an dieses Datum zu gelangen, scheint es mit Python (2.6) wohl nicht zu gehen.lunar hat geschrieben:Zumindest unter FreeBSD aber gibt es "os.stat(…).st_birthtime", was laut Dokumentation die Zeitpunkt der Erstellung angibt.
Gruß
Klaus
Dann hast du zwei Möglichkeiten, entweder du durchsuchst die Ausgabe von ls nach den Informationen die du suchst oder du guckst wie ls an die Informationen kommt(allerdings wird das vermutlich auch nicht Plattformunabhängig sein). Die Sourcen davon sollten in beiden Fällen verfügbar sein.kbr hat geschrieben:Allerdings geben die manpages von OS X und FreeBSD für die Oprtion -U von ls übereinstimmend an, den Zeitpunkt der "file creation" statt "last modification" zu verwenden.
Bliebe zu klären, wie die „Übertragung“ erfolgt. Da nicht einfach die Festplatte direkt im anderes System einbindest findest du da vielleicht eine halbwegs Plattformunabhängige Lösung.Eine "Erstellungszeit" scheinen diese beiden OSs zu kennen und sie scheint auch bei der Übertragung zwischen den beiden Systemen erhalten zu bleiben.
Ich werde jetzt erst einmal akzeptieren, dass es mit os.stat() etc. nicht geht. Mittels der Analyse der Ausgabe von ls oder plattformspezifischen Lösungen würde es sicherlich hinzubiegen sein, ist aber nicht der Weg, den ich mir gewünscht hätte.
Danke für's mitdenken!
Danke für's mitdenken!
Ok, dann hat vim, den ich benutzt hatte, mich betrogen. Sorry.Darii hat geschrieben:Das ist nicht ganz korrekt. Vielleicht liegt es an deinem Programm, dass die Datei statt sie zu ändern neu anlegt? Bei mir(Textmate) geht es zumindest.sma hat geschrieben:Ich würde sagen, der Finder betrügt dich. Wenn ich eine Datei neu erzeuge, sind "Erstellt" und "Geändert" gleich. Ändere ich eine Minute später die Datei, ist auch das "Erstellt"-Datum anders und beide Daten sind wieder gleich.
Stefan
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Ich schätze das liegt daran, dass Vim eine neue Datei erstellt, in diese speichert und dann sie über die alte drüberkopiert.sma hat geschrieben:Ok, dann hat vim, den ich benutzt hatte, mich betrogen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice