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?
Antworten:
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:
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
md5sum
unddu -h
und verschmelzen die Linien mitjoin
.quelle
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
-print0
Probleme mit Namespaces verwenden. Vielleicht bevorzugen wir stattdessen:Dann unser
/destination/file
ist bereit für jede Art von Prozess , wiesort
unduniq
wie üblich.quelle
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.
quelle