Wie md5 eine Liste von Dateipfaden, die in einer Datei enthalten sind?

Ich habe einen Ordner mit vielen Ordnern, die viele Dateien enthalten. Tausende.

Ich kann tun, find . -type f > ./FILE-LISTING.TXTum eine Datei mit vielen Tausend Dateipfaden zu erstellen, die so aussieht:

./Anders/Letters/20190101 Rent.pdf
./Anders/Letters/20190103 Appeal.pdf
./Anders/Letters/20190107 Decision.pdf
./Beeker/Letters/20180101 Rent.pdf

Wie würde ich diese Liste von Dateipfaden eingeben, md5um eine Ausgabe zu erzeugen, die wie folgt formatiert ist:

9cf14e4d666dcb6aab17763b02429a19 ./Anders/Letters/20190101 Rent.pdf
d1bb70baa31f1df69628c00632b65eab ./Anders/Letters/20190103 Appeal.pdf
7a0f5bc18688fe8ba32f43aa6ec53fb1 ./Anders/Letters/20190107 Decision.pdf
a0c96a79cf3b1847025d9f073151519d ./Beeker/Letters/20180101 Rent.pdf

NB: Ich möchte die md5-Hashes der referenzierten Dateien, nicht die md5 der Dateiliste, noch die md5-Hashes der Zeichenfolgen in der file-listing.txt.

Wäre es außerdem schneller, alles in einer Befehlszeile zu erledigen, oder in zwei Durchgängen ( findum file-listing.txt zu erstellen, dann md5um file-listing-md5.txt zu erstellen)?

Dies ist eine hervorragende Frage - klar, stellt einige Herausforderungen dar, wird aber sehr machbar sein, da jedes Tool zur Automatisierung unter MacOS Leerzeichen in Dateinamen, Schleifen und Variablen verarbeiten muss, um die sich ändernde Datei, die verarbeitet wird, zu verarbeiten. Gut gemacht – ich hoffe, wir bekommen einige großartige Antworten in Python, Bash, Swift und anderen Skriptoptionen.
Was ist Ihr Anwendungsfall für diese Datei? mtreeist ein bereits verfügbares Tool, um Datei-Hashes zu überwachen und Änderungen an Dateinamen, Dateiinhalten, Berechtigungen oder Datumsstempeln zu erkennen. man mtreefür Details.mtree -c -K md5digest
Der Anwendungsfall besteht darin, eine Datei mit Hashes und Dateipfaden an ein RDBMS eines Drittanbieters zu übergeben, das viele zusätzliche Details verfolgt, die nicht im Dateisystem vorhanden sind. Wenn die Dateien verschoben werden, können sie erneut verknüpft werden. Wenn die Datei an Ort und Stelle bearbeitet wird, kann sie erneut verknüpft werden.

Antworten (2)

find . -type f -exec /sbin/md5 -r {} +
       ^^^^^^^ ^^^^^ ^^^^^^^^^^^^ ^^ ^
          |      |        |       |  |
          |      |        |       |  +- add as many file names as possible per call
          |      |        |       +---- replace with names of found files
          |      |        +------------ command to run
          |      +--------------------- execute following command
          +---------------------------- find any "normal" file

sollte den Zweck erfüllen (und sich um die üblichen Probleme mit Leerzeichen usw. in Dateinamen kümmern).

Apropos schneller: Ein Durchlauf ist fast immer schneller als zwei Durchläufe. Im konkreten Fall nimmt die MD5-Berechnung so viel Zeit in Anspruch, dass andere Faktoren höchstwahrscheinlich vernachlässigt werden können.

PS: Hut ab vor @lhf für die Erinnerung-r

Sowohl @nohillside als auch @lhf lieferten gute, gültige Antworten. Aus einer Laune heraus entschied ich mich zu sehen, ob einer wesentlich besser ist als der andere. Ich habe beide in einem Verzeichnis ausgeführt, das mehr als 64.000 Dateien unter time. Die find -execVersion war etwa 3 Sekunden schneller als find | xargs. Die Laufzeit für beide betrug jedoch etwa 45 Sekunden, was bedeutet, dass (a) der Unterschied weniger als 10 % beträgt und (b) die Zeit wahrscheinlich I/O-gebunden ist (Drucken auf der Konsole).
Dies ist mit ziemlicher Sicherheit E / A-gebunden (aber nicht zum Drucken auf die Konsole, es muss all diese Dateien verdauen, das wird einige Zeit dauern)
@CraigS.Cottingham Es gibt ungefähr so ​​viele Dateien, aber in tief verschachtelten Verzeichnissen - nicht nur in einem Verzeichnis - was erklären könnte, warum die Ausführung der von mir geerbten Befehlszeile ungefähr 15 Minuten dauert . Wenn ich das nächste Mal vor Ort bin, werde ich auch einen Vergleich machen.
@Erics Einfache Suchbefehle (wie Sie sie in der Frage haben) sind rein E / A-gebunden. Auch bei der Berechnung von MD5-Hashes kann es sich sowohl um I/O (zum Lesen aller Daten) als auch um CPU (zum Berechnen des Hashs) handeln, dies hängt dann aber von der verwendeten Hardware ab.

Versuche dies:

find . -type f -print0 | xargs -0 md5 -r

Beachten Sie -print0und -0zur Behandlung von Leerzeichen in Dateinamen.

Im Vergleich zu find . -type f -execwird diese Lösung md5viel seltener ausgeführt, obwohl dies möglicherweise keine messbaren Auswirkungen hat.

find's -exec {}kann auch mit Leerzeichen in Dateinamen umgehen.
Sowohl @nohillside als auch @lhf lieferten gute, gültige Antworten. Aus einer Laune heraus entschied ich mich zu sehen, ob einer wesentlich besser ist als der andere. Ich habe beide in einem Verzeichnis ausgeführt, das mehr als 64.000 Dateien unter time. Die find -execVersion war etwa 3 Sekunden schneller als find | xargs. Die Laufzeit für beide betrug jedoch etwa 45 Sekunden, was bedeutet, dass (a) der Unterschied weniger als 10 % beträgt und (b) die Zeit wahrscheinlich I/O-gebunden ist (Drucken auf der Konsole).
Welche Schale verwendest du?
@ fd0, ich benutze bash.