Ich muss die Erstellungszeit einer Datei ermitteln, wenn ich einige Artikel zu diesem Problem lese, in denen alle darauf hinweisen , dass es keine Lösung gibt (z. B. Site1 , Site2 ).
Als ich den stat
Befehl ausprobierte , heißt es Birth: -
.
Wie finde ich die Erstellungszeit einer Datei?
filesystem
metadata
stat
nux
quelle
quelle
Antworten:
Es gibt eine Möglichkeit, das Erstellungsdatum eines Verzeichnisses zu ermitteln. Führen Sie einfach die folgenden Schritte aus:
Kennen Sie die Inode des Verzeichnisses per
ls -i
Befehl (sagen wir zum Beispiel sein X )Wissen, auf welcher Partition Ihr Verzeichnis per
df -T /path
Befehl gespeichert ist (sagen wir, es ist eingeschaltet/dev/sda1
)Verwenden Sie nun diesen Befehl:
sudo debugfs -R 'stat <X>' /dev/sda1
Sie sehen in der Ausgabe:
crtime ist das Erstellungsdatum Ihrer Datei.
Was ich getestet habe :
Änderte es durch Erstellen einer Datei.
Ich habe das Kommando ausprobiert und es gab eine genaue Zeit.
quelle
debugfs
es direkt aus dem Dateisystem extrahiert, sodass die Kernel-API nicht verwendet werden muss. Sehen Sie hier .statx()
ab März 2019.@Nux hat dafür eine tolle Lösung gefunden, die ihr alle positiv bewerten solltet. Ich habe beschlossen, eine kleine Funktion zu schreiben, mit der alles direkt ausgeführt werden kann. Fügen Sie einfach dieses Ihrem hinzu
~/.bashrc
.Jetzt können Sie
get_crtime
die Erstellungsdaten beliebig vieler Dateien oder Verzeichnisse ausdrucken:quelle
cp -p
oder ähnlich geschieht .df
scheint diese--output
Option nicht zu unterstützen . In diesem Fall können Sie diese Zeile durch ersetzen,fs=$(df foo | awk '{a=$1}END{print a}'
und die Funktion funktioniert auch. Alles, was ich in dieser Antwort zeige, ist eine Möglichkeit, den Befehl von der akzeptierten Antwort so zu trennen, dass er direkt für Datei- / Verzeichnisziele ausgeführt werden kann.Die Unfähigkeit
stat
, die Erstellungszeit anzuzeigen, ist auf die Beschränkung desstat(2)
Systemaufrufs zurückzuführen , dessen Rückgabestruktur kein Feld für die Erstellungszeit enthielt. Ab Linux 4.11 (dh 17.10 und neuer *) ist jedoch der neuestatx(2)
Systemaufruf verfügbar, der in seiner Rückgabestruktur eine Erstellungszeit enthält.* Und möglicherweise auf älteren LTS-Releases, die den Hardware-Enablement-Stack-Kernel (HWE-Kernel) verwenden. Überprüfen Sie
uname -r
, ob Sie mindestens bei 4.11 einen Kernel verwenden, um dies zu bestätigen.Leider ist es nicht einfach, Systemaufrufe direkt in einem C-Programm aufzurufen. Normalerweise bietet glibc einen Wrapper, der die Arbeit erleichtert, aber glibc hat erst
statx(2)
im August 2018 einen Wrapper hinzugefügt (Version 2.28 , verfügbar ab 18.10). Zum Glück hat @whotwagner ein C-Beispielprogramm geschrieben, das zeigt, wie derstatx(2)
Systemaufruf auf x86- und x86-64-Systemen verwendet wird. Die Ausgabe hat dasselbe Format wiestat
die Standardausgabe, jedoch ohne Formatierungsoptionen. Es ist jedoch einfach, das Format so zu ändern, dass nur die Geburtszeit gedruckt wird.Zuerst klonen Sie es:
Sie können den
statx.c
Code kompilieren oder, wenn Sie nur die Geburtszeit möchten,birth.c
im geklonten Verzeichnis einen mit folgendem Code erstellen (dies ist eine minimale Version desstatx.c
Ausdrucks nur des Erstellungszeitstempels einschließlich der Genauigkeit von Nanosekunden):Dann:
Theoretisch sollte dies die Erstellungszeit zugänglicher machen:
debugfs
ist ein Tool für ext2 / 3/4-Dateisysteme und für andere nicht verwendbar)make
undlinux-libc-dev
).Testen eines XFS-Systems, zum Beispiel:
Dies funktionierte jedoch nicht für NTFS und exfat. Ich denke, die FUSE-Dateisysteme für diese enthielten nicht die Erstellungszeit.
Ob oder wann glibc Unterstützung für den
statx(2)
Systemaufruf hinzufügt ,stat
wird in Kürze folgen, und wir können dafür den einfachen altenstat
Befehl verwenden. Aber ich glaube nicht, dass dies auf LTS-Releases zurückportiert wird, selbst wenn sie neuere Kernel bekommen. Daher erwarte ichstat
in keinem aktuellen LTS-Release (14.04, 16.04 oder 18.04), dass die Erstellungszeit jemals ohne manuelles Eingreifen gedruckt wird.Am 18.10 können Sie die
statx
Funktion jedoch direkt wie in beschrieben verwendenman 2 statx
(beachten Sie, dass die Manpage 18.10 nicht korrekt besagt, dass glibc den Wrapper noch nicht hinzugefügt hat).quelle
1
?TL; DR: Lauf einfach:
sudo debugfs -R 'stat /path/to/your/file' /dev/<your fs>
(Um deine Fs herauszufinden, laufe
df -T /path/to/your/file
, höchstwahrscheinlich wird es so sein/dev/sda1
).Lange Version:
Wir werden zwei Befehle ausführen:
Ermitteln Sie den Namen der Partition für Ihre Datei.
Die Ausgabe wird folgendermaßen aussehen (Partitionsname steht an erster Stelle):
Finden Sie die Erstellungszeit für diese Datei heraus.
Suchen Sie in der Ausgabe nach
ctime
.quelle