md5 alle Dateien in einer Verzeichnisstruktur

7

Ich habe ein Verzeichnis mit einer Struktur wie folgt:

%Vor%

Ich möchte ein Bash-Skript erstellen, das eine md5-Prüfsumme für jede Datei in diesem Verzeichnis erstellt. Ich möchte in der Lage sein, den Skriptnamen in der CLI einzugeben und dann den Pfad zu dem Verzeichnis, das ich hashen möchte und es funktionieren zu lassen. Ich bin mir sicher, dass es viele Möglichkeiten gibt, dies zu erreichen. Derzeit habe ich:

%Vor%

Das hängt einfach und es funktioniert nicht. Vielleicht sollte ich suchen?

Ein Nachteil - die Verzeichnisse, die ich hashen möchte, haben Dateien mit verschiedenen Erweiterungen und haben möglicherweise nicht immer genau diese Baumstruktur. Ich will etwas, das auch in diesen verschiedenen Situationen funktionieren wird.

    
Bleakley 28.04.2016, 16:21
quelle

5 Antworten

16

Verwendung von md5deep

%Vor%

Verwendung von find und md5sum

%Vor%

Beachten Sie, dass wenn Sie Ihre MD5-Summen mit md5sum -c sums.md5 überprüfen, Sie sie aus demselben Verzeichnis ausführen müssen, aus dem Sie sums.md5 file erzeugt haben. Dies liegt daran, dass find Pfade ausgibt, die sich auf Ihren aktuellen Standort beziehen, die dann in sums.md5 file abgelegt werden.

Wenn dies ein Problem ist, kannst du relative/path/to/dir absolut machen (z. B. indem du $PWD/ vor deinen Pfad legst). Auf diese Weise können Sie sums.md5 von jedem beliebigen Ort aus überprüfen. Nachteil ist, dass nun sums.md5 absolute Pfade enthält, wodurch es größer wird.

Voll funktionsfähige Funktion mit find und md5sum

Sie können diese Funktion in Ihre .bashrc -Datei (im Verzeichnis $HOME ) einfügen:

%Vor%

Nachdem Sie source ~/.bashrc ausgeführt haben, können Sie md5sums wie normalen Befehl verwenden:

%Vor%

erzeugt checksums.md5 file im Verzeichnis path/to/dir , das MD5-Summen aller Dateien in diesem Verzeichnis und in Unterverzeichnissen enthält. Verwenden Sie:

%Vor%

um die Summen von path/to/dir/checksums.md5 datei zu überprüfen.

Beachten Sie, dass path/to/dir relativ oder absolut sein kann, md5sums wird in jeder Hinsicht funktionieren. Die resultierende checksums.md5 -Datei enthält immer Pfade relativ zu path/to/dir . Sie können einen anderen Dateinamen verwenden als default checksums.md5 , indem Sie die Option -o oder --output angeben. Alle Optionen, außer -c , --check , -o und --output werden an md5sum übergeben.

Die erste Hälfte der md5sums -Funktionsdefinition ist für die Analyseoptionen verantwortlich. Weitere Informationen hierzu finden Sie diese Antwort . Zweite Hälfte enthält erläuternde Kommentare.

    
TeWu 28.04.2016 19:44
quelle
3

Wie wäre es mit:

find /path/you/need -type f -exec md5sum {} \; > checksums.md5

Update # 1: Der Befehl wurde basierend auf @ twalbergs Empfehlung, mit Leerzeichen in Dateinamen umzugehen, verbessert.

Update # 2: Verbessert basierend auf dem @ jil-Vorschlag, um unnötigen xargs -Aufruf zu entfernen und -exec -Option stattdessen zu verwenden.

Update # 3: @Blake eine naive Implementierung Ihres Skripts würde etwa so aussehen:

%Vor%     
taskalman 28.04.2016 17:12
quelle
1

Aktualisierte Antwort

Wenn Sie die Antwort unten oder eine der anderen mögen, können Sie eine Funktion erstellen, die den Befehl für Sie ausführt. Um es zu testen, geben Sie Folgendes in Terminal ein, um eine Funktion zu deklarieren:

%Vor%

Dann können Sie einfach verwenden:

%Vor%

Wenn das so funktioniert, wie Sie möchten, können Sie diese Zeile am Ende Ihres "Bash-Profils" hinzufügen und die Funktion wird deklariert und verfügbar, wenn Sie eingeloggt sind. Ihr " Bash Profil " ist wahrscheinlich in $HOME/.profile

Ursprüngliche Antwort

Warum erhalten Sie nicht alle Ihre CPU-Kerne parallel für Sie?

%Vor%

Dies findet alle Dateien ( -type f ) im aktuellen Verzeichnis ( . ) und druckt sie am Ende mit einem Nullbyte aus. Diese werden dann an GNU Parallel übergeben, wo angegeben wird, dass die Dateinamen mit einem Nullbyte enden ( -0 ) und dass sie möglichst viele Dateien gleichzeitig ausführen soll ( -X ) um das Erstellen eines neuen Prozesses für jede Datei zu speichern, und es sollte md5sum die Dateien.

Dieser Ansatz zahlt den größten Bonus in Bezug auf die Geschwindigkeit mit großen Bildern wie Photoshop-Dateien.

    
Mark Setchell 28.04.2016 21:04
quelle
1
%Vor%

Erklärung: shopt -s globstar (manuell) aktiviert ** Rekursives Glob-Wildcard. Dies bedeutet, dass ""/** auf eine Liste aller rekursiven Dateien in dem Verzeichnis erweitert wird, das als Parameter angegeben wurde. Dann ruft das Skript einfach md5sum mit dieser Dateiliste als Parameter auf und > "__checksums.md5" leitet die Ausgabe an die Datei weiter.

    
jil 28.04.2016 19:25
quelle
1
%Vor%     
Alex Jurado - Bitendian 21.04.2017 16:42
quelle