Können Sie OpenSSL verwenden, um einen MD5- oder SHA-Hash für ein Dateiverzeichnis zu generieren?

13169
Kieveli

Ich möchte ein Kennzeichen für die Datei- / Verzeichnisintegrität zwischen zwei archivierten Kopien von Verzeichnissen speichern. Es sind rund 1 TB an Daten, die rekursiv auf Festplatten gespeichert werden. Gibt es eine Möglichkeit, mit OpenSSL einen einzelnen Hash für alle Dateien zu generieren, die als Vergleich zwischen zwei Kopien der Daten verwendet werden können, oder zu einem späteren Zeitpunkt überprüfen, ob sich die Daten nicht geändert haben?

0

4 Antworten auf die Frage

3
AaronLS

Sie könnten alle Hashes rekursiv generieren, die Hashes in einer einzigen Datei verketten und dann einen Hash dieser Datei generieren.

Für einen einzelnen Befehl funktioniert etwas wie `md5 -q <(find. -Type f 2> / dev / null | xargs md5 -q | sort)` in Bash gut und erfordert keine temporäre Datei. Ändern Sie, wenn Ihr System "md5sum" anstelle von "md5" verwendet. Beachten Sie auch, dass sich "sort" auf verschiedenen Plattformen unterschiedlich verhalten kann, was sich auf die endgültige Prüfsumme auswirkt, wenn die Reihenfolge unterschiedlich ist. Fügen Sie Flaggen hinzu wie `! -name ".DS_Store" `an die Suchkomponente, um bestimmte Dateien zu ignorieren, wie z. B. die .DS_Store-Dateien unter Mac OS X, die die Prüfsumme abwerfen können, da sie vom Betriebssystem generiert werden. Justin Mrkva vor 10 Jahren 0
2
John T

Sie können keinen kumulativen Hash von allen machen, um einen einzelnen Hash zu erstellen, aber Sie können sie zuerst komprimieren und dann den Hash berechnen:

$tar -czpf archive1.tar.gz folder1/ $tar -czpf archive2.tar.gz folder2/ $openssl md5 archive1.tar.gz archive2.tar.gz 

rekursiv jede Datei hash:

$find . -type f -exec openssl md5 {} + 
1 TB Daten - kein Platz, um sie zu tarnen. Gibt es eine Möglichkeit, Hashes aller Dateien rekursiv zu generieren? Kieveli vor 14 Jahren 1
Ja, fügte es meiner Antwort hinzu. John T vor 14 Jahren 0
schöne tar-idee, aber nicht immer anwendbar. Die "find" -Methode ist im Allgemeinen besser. Wenn kein Platz für das Archiv vorhanden ist:% tar -cf - Ordner | openssl md5 akira vor 14 Jahren 0
2
Rudedog

Eine md5-Summe für den Tar auszuführen, würde niemals funktionieren, wenn nicht alle Metadaten (Erstellungsdatum usw.) identisch waren, da Tar dies als Teil seines Archivs speichert.

Ich würde wahrscheinlich eine MD5-Summe des Inhalts aller Dateien machen:

find folder1 -type f | sort | tr '\n' '\0' | xargs -0 cat | openssl md5 find folder2 -type f | sort | tr '\n' '\0' | xargs -0 cat | openssl md5 
2
c-tools

Sie sollten wahrscheinlich daran interessiert sein, den Digest im coreutils-Format auszugeben (identisch mit md5sum -b)

Der Befehl md5sum könnte also lauten:

find . -path '*/.svn' -prune -o -type f -print0 | sort | tr '\n' '\0' | xargs -0 openssl dgst -md5 -r 

oder mit einer Ausgabe in eine Datei

find . -path '*/.svn' -prune -o -type f -print0 | sort | tr '\n' '\0' | xargs -0 openssl dgst -md5 -r > ../mydigest.md5