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.
md5deep
find
und md5sum
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.
find
und md5sum
Sie können diese Funktion in Ihre .bashrc
-Datei (im Verzeichnis $HOME
) einfügen:
Nachdem Sie source ~/.bashrc
ausgeführt haben, können Sie md5sums
wie normalen Befehl verwenden:
erzeugt checksums.md5
file im Verzeichnis path/to/dir
, das MD5-Summen aller Dateien in diesem Verzeichnis und in Unterverzeichnissen enthält. Verwenden Sie:
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.
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%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.
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.
Tags und Links bash md5 directory-structure for-loop find