[Kurztipp] Prüfsummen für einen ganzen Verzeichnisbaum anlegen

Einzelne Dateien über eine Prüfsumme gegen ungewollte Veränderungen absichern - kein Problem. Aber was, wenn es sich nicht nur um eine Datei handelt, sondern um einen ganzen Verzeichnisbaum? Möglicherweise mit tausenden oder gar hunderttausenden von Dateien?

Zugegeben, der Titel ist etwas sperrig. Worum geht's also? Wenn man bei einzelnen Dateien feststellen möchte, ob diese eventuell ungewollt verändert wurden, macht man dies meist mittels einer Prüfsumme. Eine Prüfsumme gibt keine 100%-ige Garantie, dass eine Datei tatsächlich nicht verändert wurde, aber ist schon sehr sehr nahe dran.

Man kennt das vielleicht auch von Downloads aus dem Internet, bei denen dann neben dem Downloadlink zur Datei, noch eine Prüfsumme im md5, sha256, oder einem anderen Format angeboten wird. Damit ist es möglich, die Datei nach dem Download auf Richtigkeit zu prüfen. Die Prüfsumme sagt einem dabei nicht was verändert wurde, oder wo die Veränderung stattfand, sondern lediglich, dass etwas nicht passt.

Das ganze kann man auch lokal machen. Ich nutze das zum Beispiel dann, wenn ich eine größere Datenmenge habe, die ich extern irgendwo länger sichern möchte, und nachher aber auch feststellen können will, ob sich nicht doch irgendwo Bitfehler eingeschlichen haben (Flashmedien sind ja absolut nicht für Langzeitspeicherung gedacht, auch wenn man das gerne macht. Hier helfen Prüfsummen um Fehler zu erkennen. Und ja, ordentliches Backup wäre die bessere Lösung, aber manchmal geht's auch einfach nur darum Dateien von A nach B zu bringen).

Leider können die gängigen Werkzeuge nicht von Haus aus für ganze Verzeichnisse Prüfsummen anlegen, sondern nur für einzelne Dateien. Das ist etwas suboptimal, Abhilfe schafft hier die Kombination mit dem Tool find. Der Befehl zum Anlegen einer Prüfusummendatei sieht wie folgt aus:

$ find /Pfad/zum/Verzeichnis -type f -exec sha256sum {} + > sums.sha256

Die Datei sum.sha256 kann man dann mit dem Verzeichnis, oder auch separat davon ablegen.

In meinem kleinen Beispiel sieht der Inhalt der Datei sums.sha256 so aus:

$ cat sums.sha256
a3614fe562b348399b7e0a97c5720f71857caa90906434b2a7ad4d2e4ea5c27d  Test/folder1/file1.txt
db7577df14a64f7c42f5d98f4c610c73a305686758d6d50ac117a2480ad0cabc  Test/folder2/file1.txt
059d17d71aefde918abc441fca5a2cb08aa3157183e52ec82a98d643e778284f  Test/folder2/file2.txt
522403752ed2a671e95a6efed42f2832e65188312379681f22886329d1cd7680  Test/file1.txt
18e425c2e4f44b8db05e8c355f9dfc3b10a322df11dfe2667bd37d15d1df8b22  Test/file2.txt
$

Möchte man später überprüfen, ob alle Dateien unverändert sind, geht das über den Parameter -c

$ sha256sum -c sums.sha256

Im besten Fall steht hinter jeder Datei ein OK. Wurde eine Datei verändert, wird einem das auch mitgeteilt:

$ sha256sum -c sums.sha256 
Test/folder1/file1.txt: OK
Test/folder2/file1.txt: OK
Test/folder2/file2.txt: OK
Test/file1.txt: OK
Test/file2.txt: FEHLSCHLAG
sha256sum: WARNUNG: 1 berechnete Prüfsumme passte NICHT
$ 

Dann ist es an der Zeit, eine Kopie aus dem Backup zu ziehen und das Problem zu beheben.