Ich habe einen Ordner mit vielen Ordnern, die viele Dateien enthalten. Tausende.
Ich kann tun, find . -type f > ./FILE-LISTING.TXT
um 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, md5
um 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 ( find
um file-listing.txt zu erstellen, dann md5
um file-listing-md5.txt zu erstellen)?
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
time
. Die find -exec
Version 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).Versuche dies:
find . -type f -print0 | xargs -0 md5 -r
Beachten Sie -print0
und -0
zur Behandlung von Leerzeichen in Dateinamen.
Im Vergleich zu find . -type f -exec
wird diese Lösung md5
viel seltener ausgeführt, obwohl dies möglicherweise keine messbaren Auswirkungen hat.
find
's -exec {}
kann auch mit Leerzeichen in Dateinamen umgehen.time
. Die find -exec
Version 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).
Fahrrad
Jim L.
mtree
ist ein bereits verfügbares Tool, um Datei-Hashes zu überwachen und Änderungen an Dateinamen, Dateiinhalten, Berechtigungen oder Datumsstempeln zu erkennen.man mtree
für Details.mtree -c -K md5digest
Erich