Zeitstempel, Änderungszeit und Erstellungszeit einer Datei

105

Ich weiß nur, dass ls -tund ls -fgeben Sie verschiedene Sortierungen von Dateien und Unterverzeichnissen unter einem Verzeichnis.

  • Was sind die Unterschiede zwischen Zeitstempel, Änderungszeit und Erstellungszeit einer Datei?
  • Wie kann man solche Informationen mit Befehlen abrufen und ändern?
  • In Bezug auf welche Art von Informationen sagen die Leute, eine Datei sei "neuer" als die andere?
  • Welche Art von Informationsänderung wird die Datei nicht anders machen?

Zum Beispiel habe ich gesehen, dass jemand schrieb:

Standardmäßig prüft das rsync-Programm nur, ob die Dateien in Größe und Zeitstempel unterschiedlich sind. Es ist egal, welche Datei neuer ist, wenn es anders ist, wird es überschrieben. Sie können das Flag '--update' an rsync übergeben, wodurch Dateien auf dem Ziel übersprungen werden, wenn sie neuer sind als die Datei auf der Quelle, jedoch nur, solange sie vom selben Dateityp sind. Dies bedeutet, dass, wenn zum Beispiel die Quelldatei eine reguläre Datei und das Ziel ein Symlink ist, die Zieldatei unabhängig vom Zeitstempel überschrieben wird.

Bedeutet der Dateityp hier nur normale Datei und Simlink, nicht der Typ wie PDF, JPG, HTM, TXT usw.?

Tim
quelle
Siehe auch askubuntu.com/questions/62492/…
Rogerdpack

Antworten:

138

Es gibt 3 Arten von "Zeitstempeln":

  • Zugriff - das letzte Mal, wenn die Datei gelesen wurde
  • Ändern - der letzte Zeitpunkt, zu dem die Datei geändert wurde (Inhalt wurde geändert)
  • Ändern - das letzte Mal, wenn Metadaten der Datei geändert wurden (z. B. Berechtigungen)

Um diese Informationen anzuzeigen, können Sie verwenden, statwelches Teil der coreutils ist.

stat zeigt Ihnen auch einige weitere Informationen wie das Gerät, Inodes, Links usw.

Denken Sie daran, dass diese Art von Informationen stark vom Dateisystem und den Mount-Optionen abhängt. Wenn Sie beispielsweise eine Partition mit dieser noatimeOption bereitstellen, werden keine Zugriffsinformationen geschrieben.

Ein Dienstprogramm zum Ändern der Zeitstempel wäre touch. Es gibt einige Argumente, um zu entscheiden, welcher Zeitstempel geändert werden soll (z. B. -a für die Zugriffszeit, -m für die Änderungszeit) und um das Parsen eines neuen Zeitstempels zu beeinflussen. Siehe man touchfür mehr Details.

touchkann in Kombination mit cp -u( "Kopieren nur, wenn die SOURCE-Datei neuer ist als die Zieldatei oder wenn die Zieldatei fehlt" ) oder zum Erstellen leerer Markierungsdateien nützlich sein.

Echox
quelle
1
Vielen Dank! Für den Befehl rsync ist es in "egal, welche Datei neuer ist", in Bezug auf welche Art von Zeitstempel "neuer". Bedeutet der Dateityp, um den sich rsync kümmert, auch nur normale Dateien und Simlinks, nicht den Typ wie pdf, jpg, htm, txt usw.?
Tim,
2
Im Allgemeinen ist der Verweis auf die Zeit einer Datei der "geänderte" Zeitstempel. Zum Beispiel, was Sie von sehen ls -l. Und der Dateityp bezieht sich auf Datei vs. Symlink (oder andere Dateitypen wie Verzeichnisse oder Geräte). Es ist nicht der Datentyp in der Datei (Text vs. JPEG usw.).
Seth L
2
@Tim In diesem Kontext ist es der geänderte Zeitstempel. rsync gibt an, dass bei der Entscheidung, ob eine Datei gesichert werden soll, nicht geprüft wird, ob die Quelldatei vor kurzem geändert wurde, als die vorhandene Sicherung (die bei Sicherungsprogrammen üblich ist). Es wird nur geprüft, ob die Dateien unterschiedliche Größen oder Änderungszeiten haben, und in diesem Fall wird eine Sicherungskopie erstellt
Michael Mrozek
1
Und woher weiß ich, wann die Datei zuerst erstellt wurde? Werden diese Informationen irgendwo gespeichert oder gehen sie bei Updates verloren? sozusagen, wie lange existiert die datei schon ..?
XYZ
1
Die Manpage stat (2) beschreibt detaillierter, wann diese Zeitstempel geändert werden.
Cristian Ciupitu
35

Die Antwort von echox ist gültig, aber ich möchte Informationen zum Zeitpunkt der Dateierstellung hinzufügen.

Dateisystem-Unterstützung

Einige Dateisysteme unterstützen einen zusätzlichen Eintrag im Inode bezüglich der Erstellungszeit (oder der Geburtszeit). Ich weiß, dass ext4 diese Funktion und auch JFS und BTRFS unterstützt .

Die meisten Tools und APIs wurden jedoch noch nicht aktualisiert, um diese zusätzlichen Informationen zu lesen. Also, obwohl es dort sein könnte, ist es nicht zugänglich.

Unter Ubuntu 12.04 LTS erhalte ich beispielsweise für eine Datei, die ich heute erstellt habe, Folgendes:

$ echo Just another test > /tmp/mytest
$ sleep 3
$ touch /tmp/mytest
$ sleep 2
$ cat /tmp/mytest > /dev/null
$ stat /tmp/mytest 
[...]
Access: 2012-06-05 13:33:44.279774711 +0200
Modify: 2012-06-05 13:33:34.611893317 +0200
Change: 2012-06-05 13:33:34.611893317 +0200
 Birth: -
$ sudo debugfs -R 'stat /tmp/mytest' /dev/sda1
[...]
 ctime: 0x4fcdee8e:91e30114 -- Tue Jun  5 13:33:34 2012
 atime: 0x4fcdee98:42b417dc -- Tue Jun  5 13:33:44 2012
 mtime: 0x4fcdee8e:91e30114 -- Tue Jun  5 13:33:34 2012
crtime: 0x4fcdee46:01258f1c -- Tue Jun  5 13:32:22 2012
[...]

Sie können sehen, dass die neuere stat-Funktion ein Geburtsfeld hat, obwohl die Ausgabe falsch zu sein scheint. Und über debugfs können wir die Informationen erhalten (crtime wie ich auf ext4-Dateisystem bin).

Statx-Unterstützung

Es gibt jetzt seit Kernel 4.11 ein neuer STATx Systemaufruf , oben auf einem besseren Unterstützung von Y2038 oder Netzwerk - Dateisystemen, sondern bringt auch ein paar zusätzliche Funktionen wie die btimeoder Geburtszeit (Erstellungszeit) Zugang. Die Unterstützung für ext4 sollte in derselben Kernelversion 4.11 enthalten sein.

Es gab Patches, die dieses neue System in späteren Kernel-Releases unterstützen: z. B. BTRFS und F2FS in Kernel 4.13, SMB3 in 4.14, GFS2 in 4.15, NFS in 4.16 usw.

Das kommende glibc wird einen Funktionsaufruf zur Abfrage dieser Schnittstelle bereitstellen (siehe Phoronix-News zur Unterstützung von glibc statx ). Daher können wir bald Unterstützung für diese Funktion im User Space erwarten.

Huygens
quelle
Wissen Sie, ob btime intakt bleibt, wenn Dateien von Windows (Erstellungszeit) auf ext4 und umgekehrt verschoben werden, wie z. B. mtime?
Paradroid
@paradroid sorry ich kenne die antwort nicht. Wenn Sie beim Kopieren einer Datei von NTFS nach ext4 unter Linux meinen, müsste man im NTFS-Treiber nachsehen, ob er die Erstellungszeit unterstützt. Wenn Sie unter Windows meinen, müsste man im ext4-Treiber nach Windows suchen.
Huygens