Suchen Sie alle doppelten Dateien nach MD5-Hash

7

Ich versuche, alle doppelten Dateien (basierend auf MD5-Hash) zu finden und nach Dateigröße zu sortieren. Bisher habe ich Folgendes:

find . -type f -print0 | xargs -0 -I "{}" sh -c 'md5sum "{}" |  cut -f1 -d " " | tr "\n" " "; du -h "{}"' | sort -h -k2 -r | uniq -w32 --all-repeated=separate

Die Ausgabe davon ist:

1832348bb0c3b0b8a637a3eaf13d9f22 4.0K   ./picture.sh
1832348bb0c3b0b8a637a3eaf13d9f22 4.0K   ./picture2.sh
1832348bb0c3b0b8a637a3eaf13d9f22 4.0K   ./picture2.s

d41d8cd98f00b204e9800998ecf8427e 0      ./test(1).log

Ist das der effizienteste Weg?

Jamie Curran
quelle
Ok, das ist ein fairer Punkt. Aber wenn man dies als Lernübung für Linux Cmd betrachtet, kann dies verbessert werden? Zum Beispiel habe ich ursprünglich mit -exec 'md5sum .....' angefangen, aber Untersuchungen haben ergeben, dass xargs (mit Google) effizienter sind.
Jamie Curran
Wenn Sie neue Techniken erlernen möchten, schlage ich vor, zu prüfen, wie diese Tools das Problem lösen, und Sie erhalten viele clevere Ideen (die Quelle, Luke, verwenden Sie die Quelle).
Paulo Scardine
Siehe auch unix.stackexchange.com/a/71178/23542
artfulrobot

Antworten:

7

Aus "man xargs": -I impliziert -L 1 Das ist also nicht am effizientesten. Es wäre effizienter, wenn Sie md5sum nur so viele Dateinamen wie möglich geben würden. Dies wäre:

find . -type f -print0 | xargs -0 md5sum | sort | uniq -w32 --all-repeated=separate

Dann haben Sie natürlich nicht die Dateigröße. Wenn Sie wirklich die Dateigröße benötigen, erstellen Sie ein Shell - Skript, das das tut md5sumund du -hund verschmelzen die Linien mit join.

Olaf Dietsche
quelle
0

Manchmal arbeiten wir an reduzierten Sätzen von Linux-Befehlen, wie beispielsweise Busybox oder anderen Dingen, die mit NAS und anderen Linux Embedded Hardwares (IoTs) geliefert werden. In diesen Fällen können wir keine Optionen wie -print0Probleme mit Namespaces verwenden. Vielleicht bevorzugen wir stattdessen:

find | while read file; do md5sum "$file"; done > /destination/file

Dann unser /destination/fileist bereit für jede Art von Prozess , wie sortund uniqwie üblich.

Roboter
quelle
0

Verwenden Sie entweder btrfs + duperemove oder zfs mit Online-Deduplizierung. Es funktioniert auf Dateisystemebene und passt sogar zu gleichen Dateiteilen. Verwenden Sie dann die CoW des Dateisystems, um jeweils nur eines davon beizubehalten, während die Dateien an Ort und Stelle bleiben. Wenn Sie einen der freigegebenen Teile in einer der Dateien ändern, wird die Änderung separat geschrieben. Auf diese Weise können Dinge wie / media und / backup / media-2017-01-01 nur die Größe jeder einzelnen Information in beiden Bäumen verbrauchen.

orange_juice6000
quelle