Найти все дубликаты файлов по хешу MD5

6243
Jamie Curran

Я пытаюсь найти все дубликаты файлов (на основе хеша MD5) и упорядочены по размеру файла. Пока у меня есть это:

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 

Выход этого:

1832348bb0c3b0b8a637a3eaf13d9f22 4.0K ./picture.sh 1832348bb0c3b0b8a637a3eaf13d9f22 4.0K ./picture2.sh 1832348bb0c3b0b8a637a3eaf13d9f22 4.0K ./picture2.s  d41d8cd98f00b204e9800998ecf8427e 0 ./test(1).log 

Это самый эффективный способ?

7
Хорошо, это справедливо. Но если рассматривать это как учебное упражнение для linux cmd, можно ли это улучшить? Например, изначально я начал с -exec 'md5sum .....', но исследование показало (с помощью Google), что xargs был более эффективным. Jamie Curran 12 лет назад 0
Если вы хотите изучить новые методы, я предлагаю посмотреть, как эти инструменты решают проблему, и вы получите много умных идей (источник, Люк, используйте источник). Paulo Scardine 12 лет назад 0
Смотрите также http://unix.stackexchange.com/a/71178/23542 artfulrobot 9 лет назад 0

3 ответа на вопрос

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

Sometimes we are working on reduced sets of linux commands, like busybox or other things that comes with NAS and other linux embedded hardwares (IoTs). In these cases we can't use options like -print0, getting troubles with namespaces. So we may prefer instead:

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

Then, our /destination/file is ready for any kind of process like sort and uniq as usual.

0
orange_juice6000

Используйте либо btrfs + duperemove, либо zfs с онлайн-дедупликацией. Он работает на уровне файловой системы и будет соответствовать даже равным частям файла, а затем использовать CoW файловой системы, чтобы сохранить только одну из них, оставляя файлы на месте. Когда вы изменяете одну из общих частей в одном из файлов, она запишет изменение отдельно. Таким образом, вы можете иметь такие вещи, как / media и / backup / media-2017-01-01, потребляющие только размер каждого уникального фрагмента информации в обоих деревьях.

Похожие вопросы