Удаляем файлы дубликаты

Всем привет!

Возникла у меня давеча задача, почистить NAS на предмет файлов-дубликатов. Так, как человек я ленивый, то сразу же решил обратиться к мировому опыту (т.е. пошел гуглить =)

После небольшого изыскания мне попалась довольно полезная статья, перевод которой я и представлю ниже. Повествование далее ведется от автора оригинальной статьи

Ищем файлы дубликаты с помощью бесплатного и софта с открытыми исходниками

Недавно я занимался консолидированием моих файлов и резервных копий в попытке централизировать начинания по резервированию, оптимизации дискового пространства и уменьшению дублирования данных. Для меня это охватывает и Windows и Mac и Linux системы.

Далее представлены результаты моих изысканий, полезные команды и программы, которые можно использовать для поиска дублированных файлов.

Софт с открытыми исходниками

Я испробовал несколько программных продуктов с открытыми исходниками включая Duplicate Files Finder (Windows) и DUMP3 (Java). Со всем уважением к труду их авторов, это не подошло для меня. Буду очень рад узнать о других продуктах для такого рода задач.

DFF – вроде бы даже заработал, однако для меня окно результатов не очень подошло, особенно при большом объеме информации. Счетчик файлов тоже не особо порадовал 🙁 В конце концов и его я использовать не стал.

Не могу я порекомендоваить и  DUMP3, из коробки это ооооочень медленно работает так, что пришлось отказаться. Из хорошего – GUI, который имеет шанс на успех.

Также существует DUFF (Windows), похожий на потенциально полезный, при этом и имеющий баги софт. Решил его не проверять.

Погуглив обнаружил duplicate file finder thread on superuser, попробуйте, если будет желание.
В su треде я обнаружил Michael Thummerer’s AllDup. Прекрасный и бесплатный инструмент. Спасибо Synetech inc su user!

В треде по su был упомянут некий Yet Another Duplicate File Remover. Его сам не тестировал.

Бесплатные

Alldup это всё, чем должен обладать поисковик дублирующихся файлов! Он – Alldup даже предотвратил удаление некоторых MP3 файлов, распознав моё чрезмерное рвение, задав вопрос “действительно ли вы хотите это удалить?”

Фантастический GUI с интерфейсом, который идеально совпадает с моими ожиданиями. Окно результатов очень удобное и функциональное. Наилучшее из виденных мною. Программа имеет множество функций и реализаций, думая о который я могу сказать: “это очень похоже на то, как я бы это сделал”. Именно поэтому мне так понравилась эта программа и я настоятельно рекомендую её к применению.

I’ve checked tens of thousands of files with Alldup, of many flavours and sizes and its works FAST! The results are so easy to work with too!

Вот ещё один достойный упоминания кандидат на попробовать Duplicate Cleaner.

Самоделки

До AllDup я использовал следующий подход (работает в bash под Cygwin, Linux и OS X).

Задача номер один – создать список файлов, с которыми предстоит работать. Я начал с создания списка расширений файлов для данного расположения. Это позволило понять с чем придётся иметь дело.

Дополнительная проверка не повредит, ведь так? Посмотрим сколько и какого рода объекты предстоит обработать. Также будет возможность проверить корректность результатов в конце

$ find . | wc -l && find . -type f | wc -l && find . -type d | wc -l
12840 (всего объектов)
11354 (файлов)
1486 (директорий)

Сумма двух самых нижних чисел должна быть равна первой. Если это не так, то, возможно, в вашем случае, в директории существуют специальные файлы или ссылки. Неплохо об этом знать заранее.

Теперь посмотрим какие расширения есть в нашей директории. Перво-наперво посмотрим сколько файлов не имеют расширения: 

$ find . -type f | egrep -vi '\..{1,5}$' | wc -l
32

Если результат не нулевой, стоит проверить можем ли мы это игнорировать или нет.

$ find . -type f | egrep -vi '\..{1,5}$' | less

Следующая команда должна предоставить нам полный список файловых расширений для заданного расположения. По результатам можно определить для себя на чем следует сфокусировать свои старания.

$ find . -type f -and -printf "%f\n" | egrep -io '\.[^.]*$' | sort | uniq
.jpeg
.jpg
.m3u
.m4a
.m4v
.mp3
.mpeg
.ogg

Теперь детально просмотрим список файлов для, интересующих нас расширений:

$ find . -regextype posix-egrep -and -type f -and -iregex '.*\.(mp3|m4a|ogg)$'  | less

Пришло время для создания контрольных сумм, как только мы остались довольны полученным результатом. Существует множество алгоритмов создания хэшей. Наиболее распространены два md5 и crc. На моей i7 системе под Cygwin сканирование ~9000 файлов заняло 44 минуты с использованием md5sum в противовес 20 минутам с cksum.

$ find . -regextype posix-egrep -and -type f -and -iregex '.*\.(mp3|m4a|ogg)$' -and -print0 | xargs -0 -P1 -I{} -- cksum {} > my-stuff.cksum

После создания списка контрольных сумм с использованием выбранного алгоритма, пришло время его обработки. Идея состоит в следующем:

Изолируем контрольные суммы, сортируем их, находим дубликата, выводим эту информацию в файл. После чего сопоставляем полученные данные со списком всех файлов.

Примерно так:

$ awk '{print $1}' my-stuff.cksum | sort | uniq -d > my-stuff-dups.txt

И ищем дубликаты в основном файле со списком контрольных сумм и файлов:

fgrep -f my-stuff-dups.txt MP3/my-stuff.cksum | less