Der Vorschlag von ire_and_curses zur Verwendung tar c <dir>
weist einige Probleme auf:
- 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 Stellen haben, und ich kenne keine Möglichkeit, dies zu beheben (tar kann seine Eingabedateien nicht in einer bestimmten Reihenfolge "sortieren").
- Normalerweise ist es mir wichtig, ob Gruppen- und Eigentümer-ID-Nummern identisch sind, nicht unbedingt, ob die Zeichenfolgendarstellung von Gruppe / Eigentümer identisch ist. Dies entspricht beispielsweise dem, was es
rsync -a --delete
tut: Es synchronisiert praktisch alles (minus xattrs und acls), synchronisiert jedoch Eigentümer und Gruppe basierend auf ihrer ID und nicht anhand der Zeichenfolgendarstellung. Wenn Sie also mit einem anderen System synchronisiert haben, das nicht unbedingt dieselben Benutzer / Gruppen hat, sollten Sie --numeric-owner
tar das Flag hinzufügen
- tar enthält den Dateinamen des Verzeichnisses, das Sie selbst überprüfen, nur etwas, das Sie beachten sollten.
Solange es keine Lösung für das erste Problem gibt (oder wenn Sie nicht sicher sind, dass es Sie nicht betrifft), würde ich diesen Ansatz nicht verwenden.
Die find
oben vorgeschlagenen basierten Lösungen sind auch nicht gut, da sie nur Dateien und keine Verzeichnisse enthalten. Dies wird zu einem Problem, wenn Sie bei der Prüfsumme leere Verzeichnisse berücksichtigen sollten.
Schließlich werden die meisten Lösungsvorschläge nicht konsistent sortiert, 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:
- Dies
LC_ALL=C
soll eine zuverlässige Sortierreihenfolge zwischen den Systemen gewährleisten
- Dies unterscheidet nicht zwischen einem Verzeichnis "named \ nwithanewline" und zwei Verzeichnissen "named" und "withanewline", aber die Wahrscheinlichkeit, dass dies auftritt, scheint sehr unwahrscheinlich. Normalerweise behebt man dies mit einem
-print0
Flag für, find
aber da hier andere Dinge vor sich gehen, kann ich nur Lösungen sehen, die den Befehl komplizierter machen würden, als es sich lohnt.
PS: Eines meiner Systeme verwendet eine begrenzte Busybox, find
die weder unterstützt -exec
noch -print0
markiert. Außerdem wird '/' angehängt, um Verzeichnisse zu kennzeichnen, während findutils find dies nicht zu tun scheint. Daher muss ich für diesen Computer 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, daher ist dies auf diesem System kein Problem.