Finden Sie alle doppelten Dateien nach MD5-Hash

6342
Jamie Curran

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 dies der effizienteste Weg?

7
Ok, das ist ein fairer Punkt. Aber wenn man dies als Lernübung für Linux cmd betrachtet, kann man das verbessern? Zum Beispiel habe ich ursprünglich mit -exec 'md5sum .....' angefangen, aber die Recherche ergab, dass xargs (mit google) xargs effizienter war. Jamie Curran vor 11 Jahren 0
Wenn Sie neue Techniken erlernen möchten, schlage ich vor, nachzuschauen, wie diese Tools das Problem lösen, und Sie werden viele clevere Ideen erhalten (die Quelle, Luke, verwenden Sie die Quelle). Paulo Scardine vor 11 Jahren 0
Siehe auch http://unix.stackexchange.com/a/71178/23542 artfulrobot vor 8 Jahren 0

3 Antworten auf die Frage

7
Olaf Dietsche

From "man xargs": -I implies -L 1 So this is not most efficient. It would be more efficient, if you just give as many filenames to md5sum as possible, which would be:

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

Then you won't have the file size of course. If you really need the file size, create a shell script, which does the md5sum and du -h and merge the lines with join.

0
robo

Manchmal arbeiten wir an reduzierten Linux-Befehlen, wie etwa busybox oder andere Dinge, die mit NAS und anderen in Linux eingebetteten Hardwares (IoTs) geliefert werden. In diesen Fällen können wir keine Optionen verwenden, wie beispielsweise -print0Probleme mit Namespaces. So können wir stattdessen bevorzugen:

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

Dann ist unser Unternehmen /destination/filefür jeden Prozess wie sortund uniqwie gewohnt bereit .

0
orange_juice6000

Verwenden Sie entweder btrfs + duperemove oder zfs mit Online-Deduplizierung. Es funktioniert auf Dateisystemebene und wird sogar mit gleichen Dateiformaten abgeglichen. Anschließend wird mit Hilfe des Dateisystems des Dateisystems nur einer von beiden beibehalten, 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 Sie Dinge wie / media und / backup / media-2017-01-01 nur die Größe jeder einzelnen Information in beiden Bäumen belegen.