sha1sum ./path/to/directory/* | sha1sum
die oben wurde geschrieben als eine Möglichkeit , eine sha1sum eines Verzeichnisses zu berechnen , die Dateien enthält. Dieser Befehl schlägt fehl, wenn das Verzeichnis mehr Verzeichnisse enthält. Gibt es eine Möglichkeit, die sha1sum eines Verzeichnisses von Verzeichnissen universell zu berechnen (ohne einen Algorithmus an das betreffende Verzeichnis anzupassen)?
find . -type f \( -exec sha1sum "$PWD"/{} \; \) | awk '{print $1}' | sort | sha1sum
@allquixoticIm Allgemeinen gefällt mir das Muster "find | xargs" wie folgt:
Sie müssen "-print0" und "-0" verwenden, falls die Dateinamen Leerzeichen enthalten.
Dies ist jedoch dem Muster "find -exec cmd {}" sehr ähnlich.
Eine Diskussion zum Vergleichen der beiden Muster finden Sie hier: https://stackoverflow.com/questions/896808/find-exec-cmd-vs-xargs
quelle
find . -type f -print0 | xargs -0 sha1sum | awk '{print $1}' | sha1sum
.UPDATE: Es ist ein paar Jahre her, seit ich diese Antwort gepostet habe, und in der Zwischenzeit habe ich das Skript, das ich hier mehrmals vorgestellt habe, umgeschrieben und verbessert. Ich habe beschlossen, das neue Skript als brandneue Antwort neu zu veröffentlichen. Ich kann es nur wärmstens empfehlen.
EINFÜHRUNG
Ich habe beobachtet, dass die Reihenfolge, in der der Befehl find die gefundenen Elemente in einem Verzeichnis ausgibt, innerhalb identischer Verzeichnisse auf verschiedenen Partitionen variiert. Wenn Sie die Hashes desselben Verzeichnisses vergleichen, müssen Sie sich darüber keine Gedanken machen. Wenn Sie jedoch die Hashes abrufen, um sicherzustellen, dass beim Kopieren keine Dateien übersehen oder beschädigt wurden, müssen Sie eine zusätzliche Zeile für hinzufügen Sortieren des Inhalts des Verzeichnisses und seiner Elemente. Die Antwort von Matthew Bohnsack ist zum Beispiel recht elegant:
Wenn Sie es jedoch verwenden, um ein kopiertes Verzeichnis mit dem Original zu vergleichen, senden Sie die Ausgabe an eine txt-Datei, die Sie mit Kompare oder WinMerge mit der ausgegebenen Liste aus dem anderen Verzeichnis vergleichen oder indem Sie einfach die Hashes der einzelnen lis abrufen . Die Sache ist, da die Reihenfolge, in der das Find-Tool den Inhalt ausgibt, von einem Verzeichnis zum anderen variieren kann, signalisiert Kompare viele Unterschiede, da die Hashes nicht in derselben Reihenfolge berechnet wurden. Keine große Sache für kleine Verzeichnisse, aber ziemlich ärgerlich, wenn Sie mit 30000 Dateien arbeiten. Daher müssen Sie die Ausgabe in zusätzlichen Schritten sortieren, um den Vergleich der Hash-Listen zwischen den beiden Verzeichnissen zu vereinfachen.
Dies würde die Ausgabe so sortieren, dass sich Dateien mit demselben Hash in denselben Zeilen befinden, wenn das differenzierende Programm ausgeführt wird (vorausgesetzt, das neue Verzeichnis fehlt nicht).
UND AUF DAS SCRIPT ...
Hier ist ein Skript, das ich geschrieben habe. Es macht das Gleiche wie die Antwort find / xarg, sortiert jedoch die Dateien, bevor die sha1sum abgerufen wird (und speichert sie im selben Verzeichnis). Die erste Zeile des Skripts findet alle Dateien im Verzeichnis rekursiv. Der nächste sortiert die Ergebnisse alphabetisch. In den beiden folgenden Schritten wird der sortierte Inhalt verwendet, und den Dateien in der sortierten Liste werden eine sha1sum und Anführungszeichen angehängt. Dabei wird ein großes Shell-Skript erstellt, das jeden Datei-Hash nacheinander berechnet und an content_sha1sum.txt ausgibt.
Hoffe das hilft.
quelle
sort -z
(--zero-terminated
) einfacher als das Herumspielen mit einer Reihe von Dateien.EINFÜHRUNG
Vor einigen Jahren habe ich ein Skript geschrieben und vorgestellt (in diesem Thread), das die Hash-Signaturen aller einzelnen Dateien in der aktuellen Verzeichnisstruktur überprüfen und als Liste in einer Textdatei ausgeben kann.
Seitdem habe ich diese Formel mehrmals verfeinert. Ich habe beschlossen, mein neues und verbessertes Skript hier als separate Antwort neu zu veröffentlichen. Es ist für sha256 geschrieben, aber jeder, der immer noch sha1 verwenden möchte, kann einfach in gedit suchen und ersetzen, um sha256 mit sha1 zu tauschen. Persönlich habe ich sha1 seit ein paar Jahren nicht mehr verwendet und ich würde es nicht empfehlen, da es veraltet ist und Google gezeigt hat, wie es kompromittiert werden kann .
Folgendes macht mein neues Skript:
Sie können das Skript einfach verwenden, indem Sie in das zu hashende Verzeichnis gehen und Folgendes eingeben:
Alternativ können Sie dieses Skript auch aus einem anderen Verzeichnis aufrufen:
Das Skript erkennt, ob Sie über Schreibrechte im aktuellen Verzeichnis verfügen. In diesem Fall werden die Ergebnisse im aktuellen Verzeichnis gespeichert. Wenn Sie keine Schreibrechte haben oder sich Ihr aktuelles Verzeichnis in einem schreibgeschützten System befindet (z. B. eine CD-ROM), werden die Ergebnisse im Basisverzeichnis des aktuellen Benutzers gespeichert.
Das Skript erkennt, ob einige der Unterverzeichnisse mit den aktuellen Benutzerberechtigungen nicht erreichbar sind. Wenn alle lesbar sind, findet keine Erhöhung der Berechtigungen statt. Wenn dies nicht der Fall ist, werden die Berechtigungen des Benutzers auf root erhöht.
Suchen wird verwendet, um alle Dateien in der aktuellen Verzeichnisstruktur (einschließlich aller Unterverzeichnisse) zu finden. Sortieren wird verwendet, um sicherzustellen, dass die Ergebnisse alphabetisch ausgegeben werden. Die resultierende Liste wird sha256sum unterzogen und in eine Textdatei ausgegeben.
Seit dem Schreiben des alten Skripts habe ich eine Designphilosophie angenommen, nach der temporäre Dateien böse sind und nach Möglichkeit vermieden werden sollten, da sie den Benutzern die Möglichkeit geben, von böswilligen Dritten beschnüffelt und manipuliert zu werden. Alle Daten in diesem neuen Skript werden also bis zur letzten Minute als Variablen bearbeitet, wobei die Ergebnisse als Textdatei ausgegeben werden.
Die resultierende Datei selbst wird gehasht und der Pfad / Hash im Terminal ausgegeben. Ich fotografiere diese Hashes gerne mit einer alten Offline-Kamera, um sicherzustellen, dass die Ergebnisdatei nicht manipuliert wird, wenn ich sie zu einem späteren Zeitpunkt wiederhole.
Alte Ergebnisdateien werden bei der Zählung ignoriert. Das erleichtert das Vergleichen der Ergebnisse.
Hier ist ein Beispiel für die Terminalausgabe beim Ausführen meines Skripts:
Hier ist ein Ausschnitt der Ausgabe, die in 000_sha256sum_recurs_linux-headers-4.13.0-16-generic_d_22-04-2018_t_02.17.txt zu finden ist:
(Es geht weiter für weitere 7000+ Zeilen wie diese, aber Sie bekommen die Idee)
INSTALLATION
Öffnen Sie ein Terminal und geben Sie die folgenden Befehle ein:
Verwenden Sie in Nano zum Einfügen die Tastenkombination Umschalt + Strg + v. Strg-O und Enter zum Speichern. Ctr-X wird beendet. Füge mein Skript dort ein:
(Einfügen nach dem #! / bin / bash)
Achten Sie beim Verlassen von nano darauf, den erhöhten Status zu verlassen, indem Sie Folgendes eingeben:
ABSCHLIESSENDE GEDANKEN
Dies funktioniert nur, wenn Sie Bash installiert haben. Ich habe eine Synthax für die Manipulation von Teilzeichenfolgen verwendet, die mit sh, dash, ksh oder zsh nicht funktioniert. Sie können weiterhin eine der anderen Shells als tägliche Treiber verwenden, aber bash muss installiert sein.
Ausgegebene Listen können mit verschiedenen Tools verglichen werden, z. B .: (im Terminal) diff, sdiff (und grafisch) diffuse, kdiff, winmerge.
Meine Datei sortiert die Ausgabe nach dem Pfad, damit sie von Menschen leichter gelesen werden kann. Ich habe festgestellt, dass der Sortierbefehl in verschiedenen Distributionen unterschiedlich funktioniert. Beispielsweise hatten in einer Distribution GROSSBUCHSTABEN Vorrang vor Großbuchstaben und in der anderen nicht. Dies wirkt sich auf die Zeilenreihenfolge der Ausgabedateien aus und kann den Vergleich von Dateien erschweren. Dies sollte keine Probleme aufwerfen, wenn Sie das Skript immer in derselben Distribution verwenden. Dies kann jedoch der Fall sein, wenn Hash-Listen in zwei verschiedenen Umgebungen generiert wurden. Dies lässt sich leicht beheben, indem Hash-Dateien eine zusätzliche Zeit lang sortiert werden, sodass die Zeilen nach Hash und nicht nach Pfad geordnet werden:
quelle
#!/usr/bin/env bash
- es Bash in anderen Verzeichnissen als auch finden wird, weil diese kann in installiert werden / usr / bin , anstatt / bin zum Beispiel inzwischen env neigt dazu , in sein / usr / bin zu allen Zeiten soweit mir aufgefallen ist. Da Sie Bash benötigen, können Sie auch einen[[ blah-blah ]]
bedingten Ausdruck in doppelter Klammer anstelle einer allgemeineren[ blah-blah ]
Variante in einfacher Klammer verwenden.Das scheint bei mir zu funktionieren:
BEARBEITEN: Dadurch werden nur alle im Verzeichnisbaum enthaltenen Dateien zusammengefasst. Wenn der Name eines Verzeichnisses geändert wurde, kann dies nicht erkannt werden. Vielleicht so etwas wie:
Würde es tun. Etwa die gleiche Antwort wie die andere
quelle
Ein weiterer Trick könnte darin bestehen, tar zu verwenden, um die Dateiinhalte und Metadaten zu hashen:
quelle
Schnelle, robuste und tragbare Lösung
Im Gegensatz zu einigen anderen Lösungen
tar
funktioniert die folgende Lösung auf jedem Computer mit den Standard-Unix-Dienstprogrammen und ist durch Parallelisierung der Prüfsumme schneller als alle anderen Lösungen:Da am Ende eine Sortierung verwendet wird, gibt es keinen Echtzeitfortschritt. Lassen Sie den Befehl einfach ausführen.
Hier ist, was die Argumente tun:
find . -type f
findet alle Dateien im aktuellen Verzeichnis und seinen Unterverzeichnissenxargs -d'\n'
teilt die Ausgabe von find in Zeilen auf (wenn Sie erwarten, dass Dateien mit Zeilenumbrüchen enthalten sind, gehen Sie wie gewohnt vorfind -print0 | xargs -0
)-P0 n1
Läuftmd5sum
in parallelen Prozessen mit der maximalen Anzahl von Prozessen, die von der Maschine unterstützt werden (Multi-Core!)sort -k 2
sortiert nach dem zweiten Feld dermd5sum
Ausgabe, das den vollständigen Pfad zu jeder Datei angibt (das erste ist das MD5)md5sum
berechnet eine Prüfsumme aus der Liste der Dateiprüfsummen, sodass Sie eine Prüfsumme des gesamten Verzeichnisses in einer Zeile erhalten, die Sie visuell problemlos über Terminalfenster hinweg vergleichen könnenBevor Sie sagen, dass "MD5 kompromittiert wurde", denken Sie daran, was Ihr Bedrohungsmodell ist. Versuchen Sie sicherzustellen, dass die Dateien, die Sie von einem anderen Host oder Datenträger kopiert haben, intakt angekommen sind? Dann ist MD5 mehr als ausreichend, da die Wahrscheinlichkeit, dass eine Datei während der Übertragung beschädigt wird, jedoch dasselbe MD5 aufweist, null ist. Wenn Sie jedoch befürchten, dass ein Angreifer die Zeit hat, eine Datei durch eine andere mit einer kollidierenden Prüfsumme zu ersetzen, verwenden Sie
sha256sum
. Der Nachteil ist, dass SHA-Funktionen langsamer sind als MD5 .Ausführlicher Fortschritt in Echtzeit
Wenn Sie den Fortschritt in Echtzeit sehen möchten, ändern Sie die Pipeline, um eine temporäre Datei für die Prüfsummen zu verwenden:
(Beachten Sie, dass das Verschieben
sort
nach rechtsfind
nicht funktioniert, daxargs -P0
parallelisiertmd5sum
wird und die Ergebnisse möglicherweise nicht in der richtigen Reihenfolge angezeigt werden.)Diese Version des Befehls können Sie auch diff die beiden
/tmp/sums
Dateien (stellen Sie sicher , dass die zweite umbenennen , wenn sie auf der gleichen Maschine ist) und sehen , welche Dateien unterscheiden.quelle
Anstatt EINE riesige Datei mit allen gehashten Informationen zu haben, suchte ich nach einer Möglichkeit, eine Datei in jedem Ordner eines Baums zu erstellen. Ich habe mich von den Kommentaren hier inspirieren lassen. Meins ist etwas komplexer als das, was hier gepostet wird. Ich verwende die Dateirotation, aber dies ist für neue Player die am wenigsten komplexe. In dieser Version werden die alten Prüfsummen durch neue überschrieben. Es kann sinnvoll sein, 2-3 Versionen beizubehalten, je nachdem, wie häufig Sie es ausführen und wie tief Sie es benötigen.
Beachten Sie, dass mkshaindir für meine Zwecke eine separate Komponente ist, da ich möglicherweise einen Hash für Dateien in einem neuen Ordner oder einen kürzlich geänderten Ordner erstellen muss. Dies alles kann bei Bedarf in einem Skript kombiniert werden.
Der Rest bleibt als Übung für den Leser.
quelle
basierend auf der vorherigen Antwort :
find ./path/to/directory -print0 | LC_ALL=C sort --zero-terminated | tar --create --no-recursion --null --files-from /dev/stdin --file /dev/stdout --verbose --numeric-owner | sha1sum
quelle
@allquixotic
Die Antwort von generiert nicht dieselben Hashes auf verschiedenen Computern, die uns nicht dabei helfen, zu überprüfen und konsistente Hashes zu haben.Die folgende Zeile
find . -type f \( -exec md5sum "$PWD"/{} \; \)
gibt die folgende Ausgabe zurück:Daher wäre der Pfad auf verschiedenen Maschinen unterschiedlich.
awk '{print $1}'
wird uns helfen, die erste Spalte zu erhalten, die nur den Hash der Dateien enthält. Später müssen wir diese Hashes sortieren, wobei die Reihenfolge auf verschiedenen Computern unterschiedlich sein kann. Dies kann auch dazu führen, dass wir unterschiedliche Hashes haben, wenn mehr als zwei Dateien vorhanden sind.Lösung:
Für Mac:
Für Linux:
quelle