GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie kann ich eine MD5-Prüfsumme eines Verzeichnisses berechnen?

Erstellen Sie spontan eine tar-Archivdatei und leiten Sie diese an md5sum weiter :

tar c dir | md5sum

Dadurch wird ein einzelner MD5-Hashwert erzeugt, der für Ihre Datei- und Unterverzeichniskonfiguration eindeutig sein sollte. Auf der Festplatte werden keine Dateien erstellt.


Wenn Sie sich nur um Dateien und nicht um leere Verzeichnisse kümmern, funktioniert dies gut:

find /path -type f | sort -u | xargs cat | md5sum

ire_and_curses' Vorschlag, tar c <dir> zu verwenden hat einige Probleme:

  • tar verarbeitet Verzeichniseinträge in der Reihenfolge, in der sie im Dateisystem gespeichert sind, und es gibt keine Möglichkeit, diese Reihenfolge zu ändern. Dies kann effektiv zu völlig unterschiedlichen Ergebnissen führen, wenn Sie das "gleiche" Verzeichnis an verschiedenen Orten haben, und ich kenne keine Möglichkeit, dies zu beheben (tar kann seine Eingabedateien nicht in einer bestimmten Reihenfolge "sortieren").
  • Mir ist normalerweise wichtig, ob groupid- und ownerid-Nummern gleich sind, nicht unbedingt, ob die Zeichenfolgendarstellung von group/owner gleich ist. Dies entspricht beispielsweise rsync -a --delete tut:Es synchronisiert praktisch alles (abzüglich xattrs und acls), aber es synchronisiert Eigentümer und Gruppe basierend auf ihrer ID, nicht auf der Zeichenfolgendarstellung. Wenn Sie also mit einem anderen System synchronisiert haben, das nicht unbedingt dieselben Benutzer/Gruppen hat, sollten Sie den --numeric-owner hinzufügen Flagge zu tar
  • tar enthält den Dateinamen des Verzeichnisses, das Sie selbst überprüfen, nur etwas, dessen Sie sich bewusst sein sollten.

Solange es keine Lösung für das erste Problem gibt (oder Sie nicht sicher sind, dass es Sie nicht betrifft), würde ich diesen Ansatz nicht verwenden.

Der vorgeschlagene find -basierte Lösungen sind auch nicht gut, da sie nur Dateien enthalten, keine Verzeichnisse, was zu einem Problem wird, wenn Sie bei der Prüfsummenbildung auf leere Verzeichnisse achten sollten.

Schließlich sortieren die meisten vorgeschlagenen Lösungen nicht einheitlich, da die Sortierung systemübergreifend unterschiedlich sein kann.

Dies ist die Lösung, die ich mir ausgedacht habe:

dir=<mydir>; (find "$dir" -type f -exec md5sum {} +; find "$dir" -type d) | LC_ALL=C sort | md5sum

Hinweise zu dieser Lösung:

  • Die LC_ALL=C ist es, systemübergreifend eine zuverlässige Sortierreihenfolge zu gewährleisten
  • Dies unterscheidet nicht zwischen einem Verzeichnis "named\nwithanewline" und zwei Verzeichnissen "named" und "withanewline", aber die Möglichkeit, dass dies auftritt, scheint sehr unwahrscheinlich. Normalerweise behebt man das mit einem -print0 Flag für find , aber da hier noch andere Dinge passieren, sehe ich nur Lösungen, die den Befehl komplizierter machen würden, als er wert ist.

PS:Eines meiner Systeme verwendet eine eingeschränkte Busybox find die -exec nicht unterstützt noch -print0 Flags, und es hängt auch '/' an, um Verzeichnisse zu bezeichnen, während findutils find dies nicht zu tun scheint, also muss ich für diese Maschine Folgendes ausführen:

dir=<mydir>; (find "$dir" -type f | while read f; do md5sum "$f"; done; find "$dir" -type d | sed 's#/$##') | LC_ALL=C sort | md5sum

Glücklicherweise habe ich keine Dateien/Verzeichnisse mit Zeilenumbrüchen im Namen, also ist das auf diesem System kein Problem.


find /path/to/dir/ -type f -name "*.py" -exec md5sum {} + | awk '{print $1}' | sort | md5sum

Der fund listet alle Dateien auf, die auf .py enden. Der MD5-Hashwert wird für jede .py-Datei berechnet. AWK wird verwendet, um die MD5-Hash-Werte abzugreifen (wobei die Dateinamen ignoriert werden, die möglicherweise nicht eindeutig sind). Die MD5-Hash-Werte werden sortiert. Der MD5-Hashwert dieser sortierten Liste wird dann zurückgegeben.

Ich habe dies getestet, indem ich ein Testverzeichnis kopiert habe:

rsync -a ~/pybin/ ~/pybin2/

Ich habe einige der Dateien in ~/pybin2 umbenannt .

Die find...md5sum Befehl gibt die gleiche Ausgabe für beide Verzeichnisse zurück.

2bcf49a4d19ef9abd284311108d626f1  -

Um das Dateilayout (Pfade) zu berücksichtigen, also sich die Prüfsumme ändert, wenn eine Datei umbenannt oder verschoben wird, kann der Befehl vereinfacht werden:

find /path/to/dir/ -type f -name "*.py" -exec md5sum {} + | md5sum

Unter macOS mit md5 :

find /path/to/dir/ -type f -name "*.py" -exec md5 {} + | md5

Linux
  1. Shell - Wie finde ich das Verzeichnis eines Befehls?

  2. Wie kann ich in jedem Ordner eine Datei erstellen?

  3. Wie kann ich dos2unix auf einem ganzen Verzeichnis ausführen?

  4. Wie zähle ich die Anzahl der Dateien in jedem Verzeichnis?

  5. Wie kann ich eine Datei/ein Verzeichnis finden, das sich irgendwo in der Linux-Befehlszeile befinden könnte?

So zählen Sie Dateien im Verzeichnis in Linux

So ermitteln Sie die Gesamtgröße eines Verzeichnisses in Linux

Wie finde ich die älteste Datei in einem Verzeichnisbaum?

Wie kann ich eine Datei oder ein Verzeichnis namens \ entfernen?

Wie finde ich verfügbare Netzwerkschnittstellen?

Kann .so nicht im selben Verzeichnis wie die ausführbare Datei finden?