Каков наилучший способ удалить дубликаты файлов изображений с вашего компьютера?


14

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

Какой скрипт на Python или бесплатную программу вы бы порекомендовали для удаления дубликатов?

(Я читал этот похожий вопрос, но постер там спрашивает о визуальных дубликатах с разными размерами файлов. Мои точные дубликаты с разными именами файлов.)


2
Имейте в виду, что даже если все пиксели одинаковы, они все равно могут иметь различную информацию EXIF ​​(измененную программами, которые обрабатывали изображения на некоторой стадии), что создаст проблемы с большинством предлагаемых в настоящее время решений.
user12889

Ответы:


17

Не полагайтесь на суммы MD5.

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

Используйте MD5 для поиска возможных дубликатов кандидатов , а затем для каждой пары, разделяющей MD5

  1. Открывает оба файла
  2. Ищет вперед в этих файлах, пока один не отличается.

Видя, что меня обижают люди, делающие наивные подходы к дублированию идентификатора файла, если вы собираетесь полностью полагаться на алгоритм хеширования, ради бога, используйте что-то более жесткое, например SHA256 или SHA512, по крайней мере, вы уменьшите вероятность до разумная степень, проверяя больше битов. MD5 Чрезвычайно слаб для условий столкновения.

Я также советую людям читать списки рассылки здесь под названием «проверка файлов»: http://london.pm.org/pipermail/london.pm/Week-of-Mon-20080714/thread.html

Если вы говорите «MD5 может однозначно идентифицировать все файлы», то у вас логическая ошибка.

Учитывая диапазон значений, варьирующихся по длине от 40 000 байтов в длину до 100 000 000 000 байтов в длину, общее число комбинаций, доступных для этого диапазона, значительно превышает возможное число значений, представленных MD5, с весом всего 128 битов.

Представлять 2 ^ 100 000 000 000 комбинаций только с 2 ^ 128 комбинациями? Я не думаю, что это вероятно.

Наименее Наивный путь

Наименее наивный и самый быстрый способ отсеять дубликаты заключается в следующем.

  1. По размеру : файлы с разным размером не могут быть идентичными. Это занимает мало времени, так как не нужно даже открывать файл.
  2. По MD5 : Файлы с разными значениями MD5 / Sha не могут быть идентичными. Это занимает немного больше времени, потому что он должен прочитать все байты в файле и выполнить с ними математические операции, но он ускоряет несколько сравнений.
  3. В противном случае : Выполните побайтовое сравнение файлов. Это медленный тест для выполнения, поэтому его оставляют до тех пор, пока не будут учтены все другие устраняющие факторы.

Fdupes делает это. И вы должны использовать программное обеспечение, которое использует те же критерии.


7
Буквально более вероятно, что ваш жесткий диск волшебным образом уничтожит изображение, чем столкновение MD5. «Представьте 2 ^ 100 000 000 000 комбинаций только с 2 ^ 128 комбинациями» - я согласен с вами здесь. Если бы у него было 2 ^ 100 000 000 000 картинок, MD5 (или почти любой алгоритм хеширования) был бы плохим.
Грег Дин

4
нет никакой гарантии, просто маловероятно . Это не невозможно. Вполне возможно иметь 10 файлов, которые все сталкиваются друг с другом, но все они совершенно разные. Это маловероятно, но это может произойти, поэтому вы должны проверить это.
Кент Фредрик

2
размер файла, затем MD5 и только затем байт для проверки байтов.
Брэд Гилберт

3
@Kent - я на 100% согласен с тобой. Это лень игнорировать что-то, потому что это очень маловероятно, даже маловероятно, о чем мы говорим. Я был бы раздражен, если бы некоторые из моих данных были уничтожены только потому, что человек, который написал программу, думал, что что-то слишком маловероятно, чтобы беспокоиться о кодировании.
Джо Тейлор

10

Это одна строка на Unix-подобных (включая linux) ОС или Windows с установленным Cygwin:

find . -type f -print0 | xargs -0 shasum | sort |
  perl -ne '$sig=substr($_, 0, 40); $file=substr($_, 42); \
    unlink $file if $sig eq $prev; $prev = $sig'

md5sum (который примерно на 50% быстрее) можно использовать, если вы знаете, что нет преднамеренно созданных столкновений (у вас будет больше шансов выиграть 10 крупных лотерей, чем шанс найти одно естественное столкновение md5.)

Если вы хотите увидеть все дубли, которые у вас есть, а не удалять их, просто измените unlink $fileдеталь на print $file, "\n".


1
Вы также можете использовать -print0 и xargs-0 для перехвата пробелов, но find также имеет опцию -exec, которая полезна здесь: find. -тип f -exec shasum {} \; | sort ... Также: Вы не должны использовать @F (-a), потому что он не будет работать с пробелами. Попробуйте вместо этого substr.

Хороший звонок, геокар. Обновил ответ с вашими предложениями.

«md5sum (который примерно на 50% быстрее) может быть использован, если вы знаете, что нет преднамеренно созданных столкновений» - точно
Грег Дин

6

Я использовал fdupes(написано на C) и freedups(Perl) в системах Unix, и они также могут работать в Windows; Есть также похожие те , которые заявляются к работе на Windows: dupmerge, liten(написанный на Python) и т.д.


Программное обеспечение Perl и Python должно работать одинаково в системах Windows и * nix, при условии, что детали файловой системы не имеют значения.
CarlF

2

Чтобы удалить дубликаты изображений в Windows, взгляните на DupliFinder. Он может сравнивать изображения по различным критериям, таким как имя, размер и фактическая информация об изображении.

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


1

Вместо DupliFinder попробуйте раздвоенный проект DeadRinger . Мы исправили множество ошибок в первоначальном проекте, добавили кучу новых функций и значительно улучшили производительность.


1

Одним из вариантов может быть Dupkiller .

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

введите описание изображения здесь

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.