md5sum bei großen Dateien

md5sum bei großen Dateien

Kontext:

md5sumIch habe ein großes Terabyte-Laufwerk mit verschiedenen Arten von großen Mediendateien, ISO-Image-Dateien usw. Aus Geschwindigkeits-/Leistungsgründen möchte ich den Inhalt anhand des ersten Megabyte überprüfen .

Sie können eine Summe wie folgt erstellen:

FILE=four_gig_file.iso
SUM=$(head -c 1M "$FILE" | md5sum)
printf "%s *%s\n" ${SUM%-} "$FILE" >>test.md5

Wie würden Sie dies überprüfen, wenn die Signatur des ersten Megabytes sich von der der gesamten Datei unterscheidet?

Ich habe gesehen, dass dies in anderen Sprachen gemacht wird, aber ich frage mich, wie es inSchlagmd5sum -c. Ich habe mit verschiedenen Permutationen mit Rohren und so weiter experimentiert .


md5sum -cMüssten Sie, statt zu verwenden , die Hashes in einer neuen Datei neu berechnen und sie dann „diffundieren“?

Sie können ein

find /directory/path/ -type f -print0 | xargs -0 md5sum blah blah

um an einer großen Anzahl von Dateien zu arbeiten.

PS:Rsync ist keine Option

UPDATE 2: So wie es aussieht --

Mit head, find und md5sum könnte man dann relativ schnell eine Datei aus dem Quellverzeichnis erstellen und diese dann nach der Berechnung am Ziel mit diff auf der anderen Seite prüfen. Gibt es dafür clevere Einzeiler oder Skripte?

Antwort1

Wenn Sie den Inhalt nur durch die Stichprobennahme des ersten Megabyte einer Datei überprüfen, werden Sie wahrscheinlich nicht feststellen, ob einige der größeren Dateien auf die eine oder andere Weise beschädigt, zerstört oder verändert wurden. Der Grund dafür ist, dass Sie dem Hash-Algorithmus nur ein Megabyte an Daten geben, während Hunderte anderer Megabyte falsch sein könnten. Schon ein Bit an der falschen Position würde eine andere Signatur ergeben.

Wenn Sie die Datenintegrität überprüfen möchten, sind Sie mit dem CRC32-Algorithmus besser bedient. Er ist schneller als MD5. Obwohl es möglich ist, eine Datei so zu fälschen/modifizieren, dass sie die korrekte CRC32-Signatur zu haben scheint, ist es unwahrscheinlich, dass dies durch zufällige Beschädigungen jemals passieren wird.

Aktualisieren:

Hier ist ein netter Einzeiler, um die 1 Megabyte große MD5-Prüfsumme für jede Datei zu berechnen:

find ./ -type f -print0 | xargs -0 -n1 -I{} sh -c "echo '{}' >> output.md5 && head -c 1M '{}' | md5sum >> output.md5"

Ersetzen Sie md5sum durch cksum, wenn Sie möchten. Beachten Sie, dass ich mich dafür entschieden habe, den Dateinamen in die Ausgabe aufzunehmen. Das liegt daran, dass die Dateinamenzeichenfolge nicht weitergegeben wird, wenn Sie md5sum nicht die gesamte Datei geben.

Antwort2

Eine leicht abgeänderte Lösung/Beispiel, bei dem das Argument „find -size“ verwendet wird, um nur Dateien größer als 10 MB zu begrenzen und die MD5-Summe aus dem ersten und dem letzten 1 MB großen Teil der Datei zu berechnen.

find . -type f -a -size +10M -print0 | xargs -0 -n1 -I{} sh -c 'echo "$( (head -c 1M '{}'; tail -c 1M '{}' ) | md5sum) {} "'

verwandte Informationen