md5 von allen Dateien in einem Verzeichnis-Baum
Ich habe ein Verzeichnis mit einer Struktur, etwa so:
.
├── Test.txt
├── Test1
│ ├── Test1.txt
│ ├── Test1_copy.txt
│ └── Test1a
│ ├── Test1a.txt
│ └── Test1a_copy.txt
└── Test2
├── Test2.txt
├── Test2_copy.txt
└── Test2a
├── Test2a.txt
└── Test2a_copy.txt
Ich würde gerne ein bash-Skript, das eine md5-Prüfsumme von jeder Datei in diesem Verzeichnis. Ich möchte in der Lage sein, um den Typ der script-name in der CLI und dann den Pfad zu dem Verzeichnis will ich hash und funktioniert. Ich bin sicher, es gibt viele Wege, dies zu erreichen. Derzeit habe ich:
#!/bin/bash
for file in "$1" ; do
md5 >> "${1}__checksums.md5"
done
Diese hängt nur und es funktioniert nicht. Vielleicht sollte ich noch suchen?
Einem VORBEHALT - die Verzeichnisse, die ich will-hash von Dateien mit verschiedenen Erweiterungen und haben nicht immer das exakt gleiche Struktur. Ich will etwas, das funktioniert in diesen unterschiedlichen Situationen, wie gut.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mit
md5deep
Mit
find
undmd5sum
Bewusst sein, dass, wenn Sie ausführen, überprüfen Sie auf Ihre MD5-Summen mit
md5sum -c sums.md5
Sie ausführen müssen, um es aus dem gleichen Verzeichnis, aus dem Sie generiertsums.md5
- Datei. Dies ist, weilfind
Ausgänge Pfade, die relativ zu Ihrer aktuellen Position, die dann insums.md5
Datei.Ist dies ein problem, das Sie machen können
relative/path/to/dir
absoluten (z.B. durch das setzen$PWD/
vor Ihr Weg). Auf diese Weise können Sie ausführen, überprüfen Sie aufsums.md5
von jedem Ort aus. Nachteil ist, dass jetztsums.md5
enthält absolute Pfade, die macht es größer.Vollem Funktionsumfang Funktion Verwendung
find
undmd5sum
Können Sie stellen Sie diese Funktion, um Ihre
.bashrc
- Datei (befindet sich im$HOME
- Verzeichnis):Nachdem Sie laufen
source ~/.bashrc
verwenden, können Siemd5sums
wie normale Befehl:generiert
checksums.md5
Datei inpath/to/dir
- Verzeichnis, mit MD5-Summen aller Dateien in diesem Verzeichnis und in den Unterverzeichnissen. Verwendung:check-Summen aus
path/to/dir/checksums.md5
Datei.Beachten Sie, dass
path/to/dir
können relativ oder absolut sein,md5sums
funktioniert gut, so oder so. Resultierendechecksums.md5
- Datei enthält die Pfade relativ zupath/to/dir
.Sie können verschiedene Datei Namen dann Standard
checksums.md5
durch die Bereitstellung-o
oder--output
option. Alle Optionen, andere dann-c
,--check
,-o
und--output
übergebenmd5sum
.Ersten Hälfte des
md5sums
definition einer Funktion ist verantwortlich für die Analyse von Optionen. Sehen diese Antwort für mehr Informationen darüber. Die zweite Hälfte enthält erklärende Kommentare.-exec command {} +
Variante desexec
macht es noch schneller als bei der Variante-exec command ;
verwendet wird.Ubuntu 16.04
Wie etwa:
find /path/you/need -type f -exec md5sum {} \; > checksums.md5
Update#1: Verbessert den Befehl @twalberg Empfehlung zu behandeln Leerzeichen in Datei-Namen.
Update#2: Verbessert basierend auf dem @jil ' s Vorschlag, um unnötige
xargs
aufrufen und verwenden von-exec
Möglichkeit finden statt.Update#3: @Blake eine naive Implementierung von deinem script würde wie folgt Aussehen:
find /path -type f -print0 | xargs -0 md5sum
, um sich mit Dateinamen, andernfalls könnte unbeabsichtigt geteilt durch Leerzeichen...globstar
Lösung, es ist ziemlich elegant. 🙂 Allerdings, was werden Sie tun mit den Verzeichnissen enthalten?Aktualisierte Antwort
Wenn dir die Antwort unten, oder einen der anderen, können Sie eine Funktion, die den Befehl für Sie. Also, um es zu testen, geben Sie Folgendes in das Terminal zu deklarieren einer Funktion:
Dann können Sie einfach:
Wenn das funktioniert, wie Sie möchten, können Sie diese Zeile an das Ende Ihrer "bash-Profil" und die Funktion wird erklärt und immer verfügbar, wenn Sie angemeldet sind. Ihre "bash-Profil" ist wahrscheinlich in
$HOME/.profile
Ursprüngliche Antwort
Warum nicht erhalten Sie alle Ihre CPU-Kerne, die parallel arbeiten für Sie?
Dieser findet alle Dateien (
-type f
) in das aktuelle Verzeichnis (.
) und druckt diese mit einem null-byte am Ende. Diese werden dann weitergegeben an GNU Parallel, die erzählt wird, ist, dass die Dateinamen enden mit einem null-byte (-0
) und die, die es tun sollten, wie viele Dateien wie möglich auf eine Zeit (-X
) zu speichern, erstellen Sie einen neuen Vorgang für jede Datei, und es sollte md5sum-Dateien.Dieser Ansatz zahlt den größten bonus, in Bezug auf die-off Geschwindigkeit, mit der große Bilder, wie die Photoshop-Dateien.
Erklärung:
shopt -s globstar
(Handbuch) ermöglicht**
rekursive glob wildcard. Es bedeutet, dass"$1"/**
wird erweitert, um eine Liste aller Dateien rekursiv in dem Verzeichnis als parameter angegeben$1
. Dann wird das Skript ruft einfachmd5sum
mit dieser Datei, die eine Liste als parameter und> "${1}__checksums.md5"
leitet die Ausgabe in die Datei.dotglob
option:shopt -s dotglob
[source - ].#!/usr/bin/env bash shopt -s globstar for file in "$1"/** ; do md5deep -br >> "${1}__checksums.md5" done
md5deep
funktioniert nicht inubuntu 16.04