Stellen Sie fest, ob eine Datei geändert wurde


10

Wie kann man unter Linux (das derzeit das ext4-Dateisystem verwendet) schnell überprüfen, ob der Inhalt einer Datei geändert wurde, ohne den Inhalt zu lesen?

Ist der statBefehl ein empfohlener Ansatz? Das mache ich gerade

$ stat --format "%Y" hello.txt

und später kann ich überprüfen, ob der gleiche Befehl die gleiche Ausgabe liefert. Wenn ja, komme ich zu dem Schluss, dass sich hello.txt nicht geändert hat.

Ich habe das Gefühl, dass man mehr Parameter eingeben möchte, um noch sicherer zu sein. Würde das Hinzufügen der Dateigröße, des Dateinamens usw. beispielsweise einen noch besseren "Fingerabdruck" der Datei liefern?

Zu diesem Thema erinnere ich mich, dass ein TrueCrypt-Volume, das ich einmal hatte, von meinem inkrementellen Sicherungsprogramm immer ignoriert wurde, möglicherweise weil TrueCrypt sichergestellt hat, dass keine Änderungen an den Metadaten zurückbleiben. Ich nehme an, es ist tatsächlich möglich, alle von zurückgegebenen Daten zu ändern stat, daher kann nicht garantiert werden, dass jede mögliche Änderung der Datei erfasst wird.


md5sum filename?
Ramesh

md5sumoder irgendeine Art von Prüfsumme liest den Inhalt der Datei. Ich möchte das nicht tun, da es für meine Zwecke viel zu langsam ist.
DustByte

ls -tsortiert den Inhalt in einem Verzeichnis nach Änderungszeit.
Ryekayo

"wurde verändert"? Jede Datei wurde geändert, die Frage ist, wann sie geändert wurde. Mit "Suchen" können Sie nach einem bestimmten Bereich von Änderungszeiten suchen.
Ray Andrews

Antworten:


5

Wenn Sie feststellen möchten, ob eine Datei auf normale Weise geändert wurde (Bearbeiten in einer Anwendung, Auschecken einer neuen Version aus einem Revisionskontrollsystem, erneutes Erstellen usw.), überprüfen Sie, ob sich die Änderungszeit (mtime) von geändert hat die letzte Prüfung. Das ist es, was stat -c %Yberichtet.

Die Änderungszeit kann mit dem touchBefehl eingestellt werden. Wenn Sie feststellen möchten, ob sich die Datei in irgendeiner Weise geändert hat (einschließlich der Verwendung, des touchExtrahierens eines Archivs usw.), überprüfen Sie, ob sich die Inode-Änderungszeit ( ctime ) seit der letzten Überprüfung geändert hat. Das ist es, was stat -c %Zberichtet. Die ctime kann nur vom Systemadministrator gefälscht werden (und selbst dann nur auf indirekte Weise: durch Ändern der Systemuhr oder durch direkten Zugriff auf die Festplatte unter Umgehung des Dateisystems).


Danke, ich verstehe, dass ctime das ist, was ich verwenden sollte. Aus meiner Frage ergab sich nicht, dass der Zweck darin besteht, es in meinem eigenen Sicherungsskript zu verwenden, in dem Prüfsummen nur für neue oder geänderte Dateien berechnet werden. Ich kann es mir leisten, Prüfsummen für Dateien zu berechnen, die sich nur "geringfügig" geändert haben, z. B. Berechtigungen geändert haben usw. Ich bevorzuge es, den Inhalt der Datei so genau wie möglich zu betrachten, um eine Änderung festzustellen.
DustByte

3

Der Befehl stat hat nur eine Auflösung von einer Sekunde. Wenn die Datei also zweimal in derselben Sekunde geändert wurde, könnten Sie eine Änderung verpassen. Neuere Dateisysteme wie ext4 bieten Zeitstempel mit höherer Auflösung in Nanosekunden, aber einige der alten Tools haben noch nicht aufgeholt.

Es ist auch für andere Programme möglich, eine beliebige Änderungszeit festzulegen. Wie dies geschehen kann, können Sie mit dem Touch-Befehl sehen.

Wenn Sie sich über eine dieser beiden Möglichkeiten Gedanken machen, wäre es keine schlechte Idee, sich auch die Dateigröße anzusehen. Dies ist, was rsync tut, wenn es nach geänderten Dateien sucht.


1

Ich habe das Gefühl, dass man mehr Parameter eingeben möchte, um noch sicherer zu sein.

Was Sie haben, ist die richtige Methode. Der einzige Grund dafür ist, dass das Dateisystem nicht ordnungsgemäß aktualisiert wird. In diesem Fall treten eine Reihe schwerwiegenderer Probleme auf.

Natürlich gehe ich davon aus, dass jemand mit dem richtigen Wissen und Root-Zugriff auf ein System, auf das auf die Partition zugegriffen werden kann, die Informationen möglicherweise so ändern kann, dass sie so aussehen, als ob die Datei nicht geändert worden wäre. In diesem Fall hätten sie jedoch sicherlich darauf geachtet, dasselbe mit der Größe usw. zu tun.


0

Ich mache den Fingerabdruck detaillierter.

Ich habe eine kleine Wrapper-Funktion erstellt, die sowohl für die MacOS / BSD- als auch für die GNU-Version von eine identische Ausgabe generiert stat(erkennt auch die von Homebrew installierte Version mit einem gPräfix).

init() {
  if command -v gstat > /dev/null; then
    # GNU coreutils with g prefix.
    statCmdArgs=("gstat" "--format=%n %s %b %u %g %i %h %Y %Z %W %o");
  elif ! stat --version > /dev/null 2> /dev/null; then
    # MacOS/BSD stat
    statCmdArgs=("stat" "-f" "%N %z %b %u %g %i %l %m %c %B %k");
  else
    # Assume GNU version without prefix.
    statCmdArgs=("stat" "--format=%n %s %b %u %g %i %h %Y %Z %W %o");
  fi;
}

getFileStatus() {
  "${statCmdArgs[@]}" "$1";
}

Die initFunktion wird während der Skriptinitialisierung einmal aufgerufen und getFileStatuskann ohne Erkennungsaufwand wiederholt aufgerufen werden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.