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?


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

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.


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.


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.