Який найкращий спосіб видалити дублікати файлів зображень із комп'ютера?


14

У мене на комп’ютері Windows багато копій файлів зображень, в різних папках і з різними іменами файлів.

Який сценарій або безкоштовна програма Python ви б рекомендували видалити дублікати?

(Я читав цю аналогічне питання, але плакат є просять про візуальних дублікатів з різними розмірами файлів. Mine є точними копіями з різними іменами файлів.)


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

Відповіді:


17

Не покладайтеся на суми MD5.

Суми MD5 не є надійним способом перевірити наявність дублікатів, вони лише спосіб перевірити наявність відмінностей.

Використовуйте MD5 для пошуку можливих дублікатів кандидатів , а потім для кожної пари, що ділиться MD5

  1. Відкриває обидва файли
  2. Шукає вперед у цих файлах, поки один не відрізнятиметься.

Бачити я отримую downvoted люди роблять наївних підходів до дублікатів файлів ідентичності, якщо ви збираєтеся покладатися цілком на алгоритм хешування, заради бога, використовуйте що - то складніше , як 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. Помилка вищезазначених відмінностей : Виконайте байт-байтове порівняння файлів. Це повільний тест для виконання, тому він залишається до тих пір, поки не будуть розглянуті всі інші усуваючі фактори.

Фдупес це робить. І ви повинні використовувати програмне забезпечення, яке використовує ті самі критерії.


7
Буквально більше шансів, що ваш жорсткий диск магічним чином знищить зображення, ніж зіткнеться MD5. "Представляйте 2 ^ 10000000000 комбінацій лише з 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 для лову пробілів, але також є опція -exec, яка корисна тут: find. -тип f -exec shasum {} \; | сортувати ... Також: Ви не повинні використовувати @F (-a), оскільки він не працюватиме з пробілами. Спробуйте замість цього субстр.

Гарний дзвінок, геокар. Оновіть відповідь вашими пропозиціями.

"md5sum (що приблизно на 50% швидше) можна використовувати, якщо ви знаєте, що навмисно створених зіткнень немає" - саме
Грег Дін

6

Я використовував fdupes(написаний на С) та 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.