Ich muss eine zusammenfassende MD5-Prüfsumme für alle Dateien eines bestimmten Typs ( *.py
zum Beispiel) berechnen, die sich unter einem Verzeichnis und allen Unterverzeichnissen befinden.
Was ist der beste Weg das zu tun?
Bearbeiten: Die vorgeschlagenen Lösungen sind sehr schön, aber das ist nicht genau das, was ich brauche. Ich suche nach einer Lösung, um eine einzige zusammenfassende Prüfsumme zu erhalten, die das Verzeichnis als Ganzes eindeutig identifiziert - einschließlich des Inhalts aller seiner Unterverzeichnisse.
Antworten:
Der Befehl find listet alle Dateien auf, die mit .py enden. Die md5sum wird für jede .py-Datei berechnet. awk wird verwendet, um die md5sums auszuwählen (wobei die Dateinamen ignoriert werden, die möglicherweise nicht eindeutig sind). Die md5-Summen sind sortiert. Die md5sum dieser sortierten Liste wird dann zurückgegeben.
Ich habe dies getestet, indem ich ein Testverzeichnis kopiert habe:
Ich habe einige der Dateien in ~ / pybin2 umbenannt.
Der
find...md5sum
Befehl gibt für beide Verzeichnisse dieselbe Ausgabe zurück.quelle
awk ...
Teil, wenn Sie das Layout als Teil der Signatur betrachten.Erstellen Sie im Handumdrehen eine Teerarchivdatei und leiten Sie diese an
md5sum
:Dies erzeugt eine einzelne MD5-Summe, die für Ihre Datei- und Unterverzeichnis-Einrichtung eindeutig sein sollte. Es werden keine Dateien auf der Festplatte erstellt.
quelle
ls -alR dir | md5sum
. Dies ist noch besser keine Komprimierung nur ein Lesen. Es ist einzigartig, weil der Inhalt die Mod-Zeit und Größe der Datei enthält;)z
für gzip oderj
für bzip2 hinzufügen . Ich habe beides nicht getan.tar
der gleiche Satz von Dateien zweimal oder auf zwei verschiedenen Computern genau das gleiche Ergebnis liefert.Der Vorschlag von ire_and_curses zur Verwendung
tar c <dir>
weist einige Probleme auf:rsync -a --delete
tut: Es synchronisiert praktisch alles (minus xattrs und acls), synchronisiert jedoch Eigentümer und Gruppe basierend auf ihrer ID und nicht anhand der Zeichenfolgendarstellung. Wenn Sie also mit einem anderen System synchronisiert haben, das nicht unbedingt dieselben Benutzer / Gruppen hat, sollten Sie--numeric-owner
tar das Flag hinzufügenSolange es keine Lösung für das erste Problem gibt (oder wenn Sie nicht sicher sind, dass es Sie nicht betrifft), würde ich diesen Ansatz nicht verwenden.
Die
find
oben vorgeschlagenen basierten Lösungen sind auch nicht gut, da sie nur Dateien und keine Verzeichnisse enthalten. Dies wird zu einem Problem, wenn Sie bei der Prüfsumme leere Verzeichnisse berücksichtigen sollten.Schließlich werden die meisten Lösungsvorschläge nicht konsistent sortiert, da die Sortierung systemübergreifend unterschiedlich sein kann.
Dies ist die Lösung, die ich mir ausgedacht habe:
Hinweise zu dieser Lösung:
LC_ALL=C
soll eine zuverlässige Sortierreihenfolge zwischen den Systemen gewährleisten-print0
Flag für,find
aber da hier andere Dinge vor sich gehen, kann ich nur Lösungen sehen, die den Befehl komplizierter machen würden, als es sich lohnt.PS: Eines meiner Systeme verwendet eine begrenzte Busybox,
find
die weder unterstützt-exec
noch-print0
markiert. Außerdem wird '/' angehängt, um Verzeichnisse zu kennzeichnen, während findutils find dies nicht zu tun scheint. Daher muss ich für diesen Computer Folgendes ausführen:Glücklicherweise habe ich keine Dateien / Verzeichnisse mit Zeilenumbrüchen im Namen, daher ist dies auf diesem System kein Problem.
quelle
Wenn Sie sich nur für Dateien und nicht für leere Verzeichnisse interessieren, funktioniert dies gut:
quelle
Der Vollständigkeit halber gibt es md5deep (1) ; Es ist aufgrund der Filteranforderung * .py nicht direkt anwendbar, sollte aber zusammen mit find (1) gut funktionieren.
quelle
Eine Lösung, die für mich am besten funktioniert hat:
Grund, warum es bei mir am besten funktioniert hat:
Probleme mit anderen Antworten:
Dateisystem-Metadaten werden nicht ignoriert für:
tar c - "$path" | md5sum
Behandelt keine Dateinamen, die Leerzeichen enthalten, und erkennt auch nicht, ob die Datei umbenannt wurde:
quelle
Wenn Sie eine MD5-Summe möchten, die sich über das gesamte Verzeichnis erstreckt, würde ich so etwas tun
quelle
cat **.py
| md5sumPrüfen Sie alle Dateien, einschließlich des Inhalts und ihrer Dateinamen
Wie oben, jedoch nur mit * .py-Dateien
Sie können auch Symlinks folgen, wenn Sie möchten
Andere Optionen, die Sie mit grep verwenden könnten
quelle
GNU finden
quelle
Technisch müssen Sie nur laufen
ls -lR *.py | md5sum
. Sofern Sie sich keine Sorgen darüber machen, dass jemand die Dateien ändert und sie auf ihre ursprünglichen Daten zurücksetzt und niemals die Größe der Dateien ändert, sollte die Ausgabe vonls
Ihnen mitteilen, ob sich die Datei geändert hat. Mein Unix-foo ist schwach, daher benötigen Sie möglicherweise weitere Befehlszeilenparameter, um die Erstellungszeit und die Änderungszeit zum Drucken zu erhalten.ls
Außerdem erfahren Sie, ob sich die Berechtigungen für die Dateien geändert haben (und ich bin sicher, dass es Schalter gibt, mit denen Sie das deaktivieren können, wenn Sie sich nicht darum kümmern).quelle
touch
eine Datei habe, um ihr Datum (aber nicht ihren Inhalt) zu ändern, würde ich erwarten, dass die Prüfsumme unverändert bleibt.Verwenden von
md5deep
:md5deep -r FOLDER | awk '{print $1}' | sort | md5sum
quelle
Ich hatte das gleiche Problem, also habe ich mir dieses Skript ausgedacht, das nur die md5-Summen der Dateien im Verzeichnis auflistet. Wenn es ein Unterverzeichnis findet, wird es von dort aus erneut ausgeführt. Dazu muss das Skript in der Lage sein, das aktuelle Skript auszuführen Verzeichnis oder aus einem Unterverzeichnis, wenn das Argument in $ 1 übergeben wird
quelle
Wenn Sie wirklich unabhängig von den Dateisystemattributen und den Unterschieden auf Bitebene einiger Tar-Versionen sein möchten, können Sie cpio verwenden:
quelle
Es gibt zwei weitere Lösungen:
Erstellen:
Prüfen:
quelle
md5sum
funktionierte gut für mich, aber ich hatte Probleme mitsort
und Sortieren von Dateinamen. Also habe ich stattdessen nachmd5sum
Ergebnis sortiert . Ich musste auch einige Dateien ausschließen, um vergleichbare Ergebnisse zu erzielen.find . -type f -print0 \ | xargs -r0 md5sum \ | grep -v ".env" \ | grep -v "vendor/autoload.php" \ | grep -v "vendor/composer/" \ | sort -d \ | md5sum
quelle