2016-10-25 4 views
0

Ich verwende das Dienstprogramm md5deep, um Hashwerte für Dateien zu berechnen, während rekursiv durch eine Verzeichnisstruktur gegraben wird.Wie man einige Dateien und Verzeichnisse von der Ausgabe von md5deep ausschließt?

Es ermöglicht Befehl wie folgt ausführen -

md5deep -r -l -j0 app 

und gibt eine Ausgabe wie diese (rekursive Liste der MD5-Hash aller zugrunde liegenden Dateien/Verzeichnisse, deren Inhalt unter Berücksichtigung) -

d41d8cd98f00b204e9800998ecf8427e app/tests/cases/controllers/empty 
d41d8cd98f00b204e9800998ecf8427e app/tests/cases/models/empty 
d41d8cd98f00b204e9800998ecf8427e app/tests/cases/components/empty 
d41d8cd98f00b204e9800998ecf8427e app/tests/cases/helpers/empty 
d41d8cd98f00b204e9800998ecf8427e app/tests/cases/behaviors/empty 
d41d8cd98f00b204e9800998ecf8427e app/tests/groups/empty 
d41d8cd98f00b204e9800998ecf8427e app/tests/fixtures/empty 

Ich mache weiter ein md5sum auf das Ergebnis, um einen Hash der gesamten Codebasis zu erzeugen -

md5deep -r -l -j0 app | md5sum 
Ausgabe

-

86df91fc29f2891ff0aa7aaa4bd13730 - 

Nun bin ich auf den Ausschluss bestimmter Pfade (Dateien und Verzeichnisse) stecken aus, während die endgültige md5sum Berechnung berücksichtigt werden. Z.B. wenn ich diese zwei Pfade ausschließen möchte - app/tests/groups/empty und app/tests/fixtures/empty.

Die md5deep documentation bietet eine Option (-f Option), um eine Liste von Dateinamen/Verzeichnisse in einer Datei zur Verfügung zu stellen, aber diese Dateien enthalten sein. Ich suche jedoch das Gegenteil, d. H., Um einige vordefinierte Sätze von Dateien/Verzeichnissen aus dem dynamischen Satz von Verzeichnissen (neue Verzeichnisse/Dateien könnten in Zukunft hinzugefügt werden) in einem gegebenen Verzeichnis auszuschließen.

Lösungen mit regulären Ausdrücken oder einem anderen Werkzeug/Dienstprogramm als md5deep sind ebenfalls willkommen, solange es meinen Zweck erfüllt. Ich denke, eine Regex-Lösung mit Grep wäre in Abwesenheit von Lookaheads kompliziert. Z.B. die folgende regex benötigt nur eine beliebige Zeichenfolge übereinstimmen ohne ABC -

^([^A]|A([^B]|B([^C]|$)|$)|$).*$ 

https://stackoverflow.com/a/1395247/351903

Antwort

1

Warum nicht find zusammen mit md5sum mit:

find app -type f -exec md5sum {} \; 
d41d8cd98f00b204e9800998ecf8427e app/tests/groups/empty 
d41d8cd98f00b204e9800998ecf8427e app/tests/cases/components/empty 
d41d8cd98f00b204e9800998ecf8427e app/tests/cases/behaviors/empty 
d41d8cd98f00b204e9800998ecf8427e app/tests/cases/models/empty 
d41d8cd98f00b204e9800998ecf8427e app/tests/cases/helpers/empty 
d41d8cd98f00b204e9800998ecf8427e app/tests/cases/controllers/empty 
d41d8cd98f00b204e9800998ecf8427e app/tests/fixtures/empty 

Wenn Sie ein Verzeichnis ausschließen müssen, verwenden Sie die Option -path und wenn Sie Dateinamen ausschließen müssen -name.

Zum Beispiel, wenn Sie ausschließen Datei möchten, die models in ihren Pfadnamen, verwenden Sie die folgende Komponenten enthalten würde:

find app -type f ! -path "*models*" -exec md5sum {} \; 

BTW, wenn Ihr bei leeren Dateien suchen, können Sie die -empty Option: find app -empty

+0

Sieht gut aus. Ich habe nur eine Frage. Gibt es eine Möglichkeit, dass einzelne MD5sums in unterschiedlicher Reihenfolge zurückgegeben werden? Da dies zu anderen Ergebnissen führen kann, wenn ich die obige Ausgabe übergebe, um einen abschließenden Hash wie folgt zu erhalten: 'find app -type f! -path "* models *" -exec md5sum {} \; '. FYI, die '-j0' im Befehl' md5deep -r -l -j0 App | md5sum' steht für die Verwendung von 1 Thread, um Nicht-Determinismus zu verhindern, da einzelne md5sums in verschiedenen Ordnungen zurückgegeben werden. –

+0

Es scheint, dass die obigen Bedenken auftreten werden, wenn "find" Multithreading verwendet. –

+0

@SandeepanNath Der 'find' führt den Befehl' md5sum' sequentiell aus, während er den gesamten Verzeichnisbaum durchläuft.Es gibt kein Multithreading in dem Befehl, den ich gepostet habe – oliv

Verwandte Themen