Wie überprüfe ich alle Zeitstempel einer Datei?

52

Gibt es in Linux einen Befehl, um alle Zeitstempel einer Datei zu überprüfen?

Ich versuche, die zuletzt geänderten, erstellten und berührten Daten in der Datei anzuzeigen.

Mechaflash
quelle
4
Nur um darauf hinzuweisen, Linux-Dateien haben kein Geburtsdatum. Daher ist es nicht möglich, das Erstellungsdatum einer Datei zu bestimmen.
FatalError
bemerkte, dass = (. Vielen Dank für den Hinweis auf mich.
Mechaflash
4
@FatalError: Verschiedene Dateisysteme unterstützen bereits Geburts- / Erstellungszeitstempel. Das eigentliche Problem besteht darin, auf solche zusätzlichen Informationen zuzugreifen . (Man kann struct statleider nicht einfach erweitern, ohne Dinge zu zerbrechen ...) Sie können debugfs -R "stat <1234>" /dev/sdXYext4 ausprobieren , indem Sie es 1234durch ein ino ersetzen .
Grawity
@grawity: Ordentlich! Ich habe mich immer gefragt, warum es keine Fs gibt ... aber ich denke, sie tun es, aber wie Sie sagten, können nicht einfach die ABI für vorhandene Binärdateien brechen. Danke für den Tipp :).
FatalError
1
@FatalError, Die Geburtszeit kann mit dem Linux- statBefehl angezeigt werden. Siehe Wie finde ich das Erstellungsdatum der Datei? und Welche Dateisysteme unter Linux speichern die Erstellungszeit? .
Franklin Piat

Antworten:

73

Der Befehl wird aufgerufen stat.

$ stat test
234881026 41570368 -rw-r--r-- 1 werner staff 0 0 "Feb  7 16:03:06 2012" "Feb  7 16:03:06 2012" "Feb  7 16:03:06 2012" "Feb  7 16:03:06 2012" 4096 0 0 test

Wenn Sie das Format anpassen möchten, lesen Sie die Manpages, da die Ausgabe betriebssystemspezifisch ist und unter Linux / Unix variiert.

Im Allgemeinen können Sie die Zeiten auch über eine normale Verzeichnisliste abrufen:

  • ls -l gibt aus, wann der Dateiinhalt zuletzt geändert wurde mtime
  • ls -lcGibt den letzten Zeitpunkt der Dateistatusänderung aus. ctime( Was ist der Unterschied? )
  • ls -lugibt die letzte Zugriffszeit aus, die atime(obwohl der Nutzen dieses Konzepts zur Diskussion steht )

Und natürlich ctimewird nicht aufgezeichnet, wann eine Datei "erstellt" wurde. Die POSIX-Spezifikation definiert nur drei Zeitstempel, aber einige Linux-Dateisysteme speichern die Geburts- / Erstellungszeit. Wie finde ich das Erstellungsdatum der Datei? Auf einer solchen unterstützten Konfiguration könnte man verwenden

stat --printf '%n\nmtime: %y\nctime: %z\natime: %x\ncrtime:%w\n'
slhck
quelle
statist wirklich detailliert. Benötigt aber lsnur eine Leitung. Es wäre gut, wenn es auch Sekunden anzeigen könnte. Bei der Erstellung von Dateilisten ist jedoch die erstere perfekt geeignet.
neverMind9
ls -l war die schnelle Lösung für mich
Andrew
Ich habe festgestellt, dass das Ergebnis von ls -lein anderes Datumsformat anzeigen kann, wenn BusyBox installiert ist (auf Android). Ich denke, dass es ohne so etwas wie "2019-07-26 14:41" und mit so etwas wie "6. Mai 21:27" ist. Wie kommt es, dass das Jahr fehlt? Gibt es eine Möglichkeit, es im Format ohne zu erzwingen?
Android-Entwickler
@androiddeveloper Wie gesagt, die Antwort hängt vom Betriebssystem ab. Ich denke, Sie sollten eine neue Frage öffnen. Wenn Sie speziell über Android sprechen, sind vielleicht Stack Overflow oder Android Enthusiasts passender.
Slhck
@slhck Nun, es ist dasselbe Betriebssystem, nur mit installierter BusyBox. Ich habe gefragt, ob es möglich ist (was bedeutet: Gibt es einen Befehl, der verwendet werden kann), um das anzuzeigende Format zu erhalten.
Android-Entwickler
21

Es werden nur DREI unterschiedliche Zeitwerte für jede Ihrer Dateien gespeichert, wie im POSIX-Standard definiert : http://pubs.opengroup.org/onlinepubs/9699919799/ (siehe Abschnitt Basisdefinitionen -> 4. Allgemeine Konzepte -> 4.8 Datei Times Update)

Jeder Datei sind drei unterschiedliche Zeitstempel zugeordnet: der Zeitpunkt des letzten Datenzugriffs , der Zeitpunkt der letzten Datenänderung und der Zeitpunkt, zu dem sich der Dateistatus zuletzt geändert hat . Diese Werte werden in der Dateieigenschaftsstruktur struct stat zurückgegeben, wie in <sys / stat.h> beschrieben .

Und von <sys / stat.h> :

atime is for Last data access timestamp.
mtime is for Last data modification timestamp.
ctime is for Last file status change timestamp.

Die folgenden Beispiele zeigen den Unterschied zwischen atime , mtime und ctime . Diese Beispiele sind in GNU / Linux BASH enthalten. Sie können stat -xin Mac OS X oder einem anderen BSD Dist. um das ähnliche Ausgabeformat zu sehen.

$ stat --version
stat (GNU coreutils) 8.4
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Michael Meskes.
$
$ touch test
$ stat test
  File: `test'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 811h/2065d  Inode: 98828525    Links: 1
Access: (0664/-rw-rw-r--)  Uid: (  514/    rank)   Gid: (  514/    rank)
Access: 2014-03-16 10:58:28.609223953 +0800
Modify: 2014-03-16 10:58:28.609223953 +0800
Change: 2014-03-16 10:58:28.609223953 +0800

Wenn die Datei gerade erstellt wird, sind drei Zeitstempel gleich.


1. atime

Greifen wir zunächst auf die Daten der Datei zu, indem wir sie lesen ( lessoder vim), ausdrucken ( cat) oder in eine andere Datei kopieren ( cp).

$ cat test #Nothing will be printed out, since the file is empty
$ stat test
  File: `test'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 811h/2065d  Inode: 98828525    Links: 1
Access: (0664/-rw-rw-r--)  Uid: (  514/    rank)   Gid: (  514/    rank)
Access: 2014-03-16 10:59:13.182301069 +0800  <-- atime Changed!
Modify: 2014-03-16 10:58:28.609223953 +0800
Change: 2014-03-16 10:58:28.609223953 +0800

2. ctime

Jetzt ändern wir den Dateistatus, indem wir die Berechtigung ändern ( chmod) oder umbenennen ( mv)

$ chmod u+x test
$ stat stet
  File: `test'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 811h/2065d  Inode: 98828525    Links: 1
Access: (0764/-rwxrw-r--)  Uid: (  514/    rank)   Gid: (  514/    rank)
Access: 2014-03-16 10:59:13.182301069 +0800
Modify: 2014-03-16 10:58:28.609223953 +0800
Change: 2014-03-16 11:04:10.178285430 +0800  <-- ctime Changed!
$    
$ mv test testing
$ stat testing
  File: `testing'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 811h/2065d  Inode: 98828525    Links: 1
Access: (0764/-rwxrw-r--)  Uid: (  514/    rank)   Gid: (  514/    rank)
Access: 2014-03-16 10:59:13.182301069 +0800
Modify: 2014-03-16 10:58:28.609223953 +0800
Change: 2014-03-16 11:06:33.342207679 +0800  <-- ctime Changed again!

Beachten Sie, dass der Inhalt (die Daten ) der Datei bis jetzt immer noch derselbe ist, als sie erstellt wurde.


3. mtime

Zuletzt ändern wir den Inhalt der Datei, indem wir die Datei bearbeiten.

$ echo 'Modify the DATA of the file' > testing
$ echo 'Modify the DATA of the file also change the file status' > testing
$ stat testing
  File: `testing'
  Size: 56          Blocks: 8          IO Block: 4096   regular file
Device: 811h/2065d  Inode: 98828525    Links: 1
Access: (0764/-rwxrw-r--)  Uid: (  514/    rank)   Gid: (  514/    rank)
Access: 2014-03-16 10:59:13.182301069 +0800
Modify: 2014-03-16 11:09:48.247345148 +0800  <-- mtime Changed!
Change: 2014-03-16 11:09:48.247345148 +0800  <-- ctime also Changed!

4. Geburtszeit

Beachten Sie auch, dass die neuere Version von stat(z. B. stat --version 8.13in Ubuntu 12.04) Informationen zum vierten Zeitstempel enthält - die Geburtszeit (Erstellungszeit der Datei). Obwohl im Moment möglicherweise nicht die richtige Uhrzeit angezeigt wird:

$ stat --version
stat (GNU coreutils) 8.13
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Michael Meskes.
$
$ stat birth_time
  File: `birth_time'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 805h/2053d  Inode: 4073946     Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/ bingyao)   Gid: ( 1000/ bingyao)
Access: 2014-03-16 10:46:48.838718970 +0800
Modify: 2014-03-16 10:46:48.838718970 +0800
Change: 2014-03-16 10:46:48.838718970 +0800
 Birth: -
YaOzI
quelle
Was bedeutet 10: 46: 48.838718970? HH: MM: SS. Nanosekunden?
Dzung Nguyen
2
Ja . "Seit Kernel 2.5.48 unterstützt die stat-Struktur die Auflösung von Nanosekunden für die drei Felder mit dem Datei-Zeitstempel ...."
Tom Lord,
Die Erstellungszeit kann bei Bedarf mit root-Zugriff und Debugging herausgefunden werden
Mikko Rantalainen
2
Geburtszeit ... gerne. Denn die letzte Änderung und die letzte Änderung dienen fast demselben Zweck, sind aber immer noch verschieden. Es ist gut, wenn alle vier existieren.
neverMind9