Listen Sie Dateien auf, die größer als die angegebene Größe sind, und erstellen Sie dann md5sum oder sha256sum

623
Bug J.

Ich möchte wissen, wie man eine Liste mit md5sums aus Dateien im aktuellen Verzeichnis erstellt - Dateien, die eine bestimmte Größe überschreiten. Ich kann das eine oder das andere tun, aber ich weiß nicht, wie ich beides kombinieren kann.

6

1 Antwort auf die Frage

8
styrofoam fly

Sie können finddie Ausgabe per Pipe ausführen (wodurch alle Dateien aufgelistet werden, an denen Sie interessiert sind) md5sum.

xargs wird benötigt, um das Erstellen einer Schleife zu vermeiden.

Um es in einen Befehl zu schreiben:

find . -maxdepth 1 -size +30M -type f -print0 | xargs -0 md5sum

  • . sagt "fängt an, Elemente aus dem aktuellen Verzeichnis aufzulisten"
  • -maxdepth 1 Gibt an, dass nur Dateien in diesem Verzeichnis aufgelistet werden sollen (nicht tiefer absteigen).
  • -size +30Mgibt nur Dateien aufzulisten, die 30 Megabyte Speicherplatz überschreiten (Sie auch verwenden können, kund Glesen, wenn nötig Suffixe, um mehr über ihre Möglichkeiten in, man findwenn erforderlich)
  • -type fvermeidet das Auflisten von Verzeichnissen - Sie können nicht md5sumfür ein Verzeichnis zählen
  • -print0macht findseparate Dateinamen mit dem Null-Byte. Wir verwenden dies, weil alles fehlschlägt, wenn Sie eine neue Zeile in Dateiname eingeben.

xargsnimmt Sachen aus der Standardeingabe (dank -0Flag wird das Null-Byte als Datensatztrennzeichen behandelt) und fügt sie als Argumente hinzu md5sum.

Du kannst es auch ohne Pipe machen, aber ich finde diese Syntax verwirrend und ich ziehe es vor zu pfeifen an xargs: find . -maxdepth 1 -size +30M -type f -execdir md5sum {} \;

Und wie @David in den Kommentaren schreibt, können Sie +nach {}, dh find . -maxdepth 1 -size +30M -type f -execdir md5sum {} + \;.

Was ändert sich? md5sumkann für zwei Dateien auf zwei Arten aufgerufen werden: md5sum file1; md5sum file2oder md5sum file1 file2. Ohne die +Option erhalten Sie die erste Option. Fügen Sie +Ergebnisse hinzu, wenn Sie die zweite Option ausführen. Der wichtigste Vorteil ist die Geschwindigkeit, da md5sumnur einmal ausgeführt wird. Es kann nicht sein, dass vorteilhaft für einige Programme, aber in einigen Fällen kann ein Programm zum Beispiel dann läuft auf vielen Kernen und Speed-up der Arbeit um den Faktor NUM_CPUS.

Über diese seltsame Syntax (von man find):

-execdir Befehl;

Befehl ausführen; truewenn der 0Status zurückgegeben wird Alle folgenden zu suchenden Argumente gelten als Argumente für den Befehl, bis ein Argument gefunden wird, das aus ';'besteht. Die Zeichenfolge '{}'wird durch den aktuellen Dateinamen ersetzt, der überall dort verarbeitet wird, wo er in den Argumenten des Befehls vorkommt, nicht nur in Argumenten, in denen er sich alleine befindet, wie in einigen Versionen von find. Diese beiden Konstruktionen müssen möglicherweise mit (a '\') umgangen oder in Anführungszeichen gesetzt werden, um sie vor der Erweiterung durch die Shell zu schützen. Im Abschnitt BEISPIELE finden Sie Beispiele für die Verwendung der -execdirOption. Der angegebene Befehl wird für jede übereinstimmende Datei einmal ausgeführt.

Sehr informativ werde ich es versuchen! Wie bekomme ich das in eine Textdatei? > Prüfsummen.md5? Bug J. vor 6 Jahren 0
Sicher, setzen Sie einfach `> checksums.md5` am Ende dieses" Skripts ". Denken Sie nur daran, dass, wenn Sie `checksums.md5` in Ihr aktuelles Verzeichnis einfügen, es dessen (die 'checksums.md5'-Datei der Datei) darin hat und dieser Hash falsch ist ... Es ist ein schwieriges Problem, ein Datei, die einen eigenen Hash enthält. styrofoam fly vor 6 Jahren 0
Wenn Sie GNU `find 'haben, können Sie` -exec md5sum {} + `verwenden, um alle Übereinstimmungen an einen einzigen` md5sum'-Befehl zu übergeben (vorausgesetzt, sie passen alle auf eine einzige Befehlszeile). David Foerster vor 6 Jahren 3