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ürfind
, 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