Sicherlich muss es einen Weg geben, dies einfach zu tun!
Ich habe die Linux-Befehlszeilen-Apps wie sha1sum
und ausprobiert, md5sum
aber sie scheinen nur in der Lage zu sein, Hashes einzelner Dateien zu berechnen und eine Liste von Hash-Werten auszugeben, einen für jede Datei.
Ich muss einen einzelnen Hash für den gesamten Inhalt eines Ordners generieren (nicht nur für die Dateinamen).
Ich würde gerne so etwas machen
sha1sum /folder/of/stuff > singlehashvalue
Bearbeiten: Zur Verdeutlichung befinden sich meine Dateien auf mehreren Ebenen in einem Verzeichnisbaum. Sie befinden sich nicht alle im selben Stammordner.
Antworten:
Ein möglicher Weg wäre:
Wenn es einen ganzen Verzeichnisbaum gibt, ist es wahrscheinlich besser, find und xargs zu verwenden. Ein möglicher Befehl wäre
Und schließlich, wenn Sie auch Berechtigungen und leere Verzeichnisse berücksichtigen müssen:
Die Argumente dazu
stat
bewirken, dass der Name der Datei gedruckt wird, gefolgt von den oktalen Berechtigungen. Die beiden Suchvorgänge werden nacheinander ausgeführt, wodurch die doppelte Menge an Festplatten-E / A verursacht wird. Der erste findet alle Dateinamen und prüft den Inhalt, der zweite findet alle Datei- und Verzeichnisnamen, druckt Namen und Modus. Die Liste der "Dateinamen und Prüfsummen", gefolgt von "Namen und Verzeichnissen mit Berechtigungen", wird dann für eine kleinere Prüfsumme mit einer Prüfsumme versehen.quelle
find ./folder -type f -print0 | sort -z | xargs -0 sha1sum | sha1sum
/
auf daspath/to/folder
Bit gesetzt habe.Verwenden Sie ein Tool zur Erkennung von Dateisystemeinbrüchen wie aide .
Hash einen Teerball des Verzeichnisses:
tar cvf - /path/to/folder | sha1sum
Codieren Sie selbst etwas wie den Oneliner von vatine :
find /path/to/folder -type f -print0 | sort -z | xargs -0 sha1sum | sha1sum
quelle
git config --local core.fileMode false
vor dem Festschreiben eine Ausgabe durchführen , um dies zu vermeiden. Ich weiß nicht, ob es noch solche Vorbehalte gibt.Du kannst tun
tar -c /path/to/folder | sha1sum
quelle
--mtime
Option wie folgt hinzufügen, wenn Sie sich um Dateiinhalte, Berechtigungen usw., aber nicht um die Änderungszeit kümmern :tar -c /path/to/folder --mtime="1970-01-01" | sha1sum
.Wenn Sie nur überprüfen möchten, ob sich etwas im Ordner geändert hat, würde ich Folgendes empfehlen:
Sie erhalten lediglich einen Hash der ls-Ausgabe, die Ordner, Unterordner, ihre Dateien, ihren Zeitstempel, ihre Größe und ihre Berechtigungen enthält. So ziemlich alles, was Sie brauchen würden, um festzustellen, ob sich etwas geändert hat.
Bitte beachten Sie, dass dieser Befehl nicht für jede Datei einen Hash generiert. Deshalb sollte er schneller sein als die Verwendung von find.
quelle
Ein robuster und sauberer Ansatz
Dies ist, was ich auf meinem Kopf habe, jeder, der einige Zeit damit verbracht hat, praktisch daran zu arbeiten, hätte andere Fallstricke und Eckfälle gefangen.
Hier ist ein sehr speicherschonendes Tool , das die meisten Fälle anspricht, an den Rändern möglicherweise etwas rau ist, aber sehr hilfreich war.
Ein Beispiel für die Verwendung und Ausgabe von
dtreetrawl
.Ein Ausschnitt aus menschenfreundlichen Ergebnissen:
quelle
Wenn Sie nur den Inhalt der Dateien hashen und die Dateinamen ignorieren möchten, können Sie verwenden
Stellen Sie sicher, dass Sie die Dateien in derselben Reihenfolge haben, wenn Sie den Hash berechnen:
Sie können jedoch keine Verzeichnisse in Ihrer Dateiliste haben.
quelle
Wenn dies ein Git-Repo ist und Sie alle darin enthaltenen Dateien ignorieren
.gitignore
möchten, möchten Sie möglicherweise Folgendes verwenden:Das funktioniert gut für mich.
quelle
Dafür gibt es ein Python-Skript:
http://code.activestate.com/recipes/576973-getting-the-sha-1-or-md5-hash-of-a-directory/
Wenn Sie die Namen einer Datei ändern, ohne ihre alphabetische Reihenfolge zu ändern, wird sie vom Hash-Skript nicht erkannt. Wenn Sie jedoch die Reihenfolge der Dateien oder den Inhalt einer Datei ändern, erhalten Sie beim Ausführen des Skripts einen anderen Hash als zuvor.
quelle
Ein weiteres Werkzeug, um dies zu erreichen:
http://md5deep.sourceforge.net/
Wie es sich anhört: wie md5sum, aber auch rekursiv, plus andere Funktionen.
quelle
Versuchen Sie es in zwei Schritten:
Wie so:
Oder alles auf einmal:
quelle
for F in 'find ...' ...
funktioniert nicht, wenn Sie Leerzeichen in Namen haben (was Sie heutzutage immer tun).Ich würde die Ergebnisse für einzelne Dateien durch
sort
(um eine bloße Neuordnung von Dateien zu verhindern, um den Hash zu ändern) inmd5sum
odersha1sum
weiterleiten, je nachdem, was Sie wählen.quelle
Ich habe dazu ein Groovy-Skript geschrieben:
Sie können die Verwendung anpassen, um zu vermeiden, dass jede Datei gedruckt wird, der Nachrichtenauszug geändert wird, Verzeichnis-Hashing ausgeführt wird usw. Ich habe sie anhand der NIST-Testdaten getestet und sie funktioniert wie erwartet. http://www.nsrl.nist.gov/testdata/
quelle
Ich musste in ein ganzes Verzeichnis nach Dateiänderungen suchen.
Aber mit Ausschluss, Zeitstempeln, Verzeichnisbesitz.
Ziel ist es, überall eine identische Summe zu erhalten, wenn die Dateien identisch sind.
Einschließlich des Hostings auf anderen Computern, unabhängig von den Dateien, oder einer Änderung an diesen.
Es generiert eine Liste von Hashs nach Dateien und verkettet diese Hashes zu einem.
Dies ist viel schneller als die Teermethode.
Für eine stärkere Privatsphäre in unseren Hashes können wir sha512sum nach demselben Rezept verwenden.
Die Hashes sind mit sha512sum auch überall identisch , es ist jedoch keine Möglichkeit bekannt, sie umzukehren.
quelle
sha256sum /tmp/thd-agent/* | sort
ist das, was ich für eine zuverlässige Bestellung versuche, dann nur das Hashing.ls -r | sha256sum
?Sie können
sha1sum
die Liste der Hash-Werte generieren undsha1sum
diese Liste dann erneut. Dies hängt davon ab, was genau Sie erreichen möchten.quelle
Hier ist eine einfache, kurze Variante in Python 3, die für kleine Dateien (z. B. einen Quellbaum oder etwas, bei dem jede Datei einzeln problemlos in den Arbeitsspeicher passt) problemlos funktioniert. Dabei werden leere Verzeichnisse ignoriert, basierend auf den Ideen der anderen Lösungen:
Es funktioniert so:
Sie können eine andere Hash-Funktion als zweiten Parameter übergeben, wenn SHA-1 nicht Ihre Tasse Tee ist.
quelle