Пошук дублікатів файлів в OSX за допомогою хеша


14

Я шукаю спосіб пошуку визначеного файлу в OSX (Maverick, але загалом OSX). Зокрема, я хотів би зробити наступне: з
урахуванням File_001 я хотів би шукати, чи є у файловій системі копія цього файлу.
Не тільки з тим же ім'ям, я хотів би, щоб метод порівняння був алгоритмом хешування, як MD5, SHA тощо.

Більшість "шукачів дублікатів файлів" я спробував просто знайти всі дублікати на диску / системі. Натомість мені було б цікаво подати один файл і шукати його дублікати.

Хтось знає, чи існує така програма? Можливо, якась незрозуміла функція Spotlight?


1
Будьте уважні до хешу, визначаючи, чи даний файл є копією. Наприклад, такий підхід може не працювати із файлами .emlx (формат файлу Apple Mail). В якості допомоги Spotlight OSX додає метадані до поштових файлів. Один і той же електронний лист у двох різних контурах може мати різні метадані, навіть якщо ідентифікатор повідомлення однаковий. Різний хеш для двох файлів, що містять точно таку саму електронну пошту.
Джон Д.

Відповіді:


17

Ви також можете використовувати fdupes. У ньому немає можливості пошуку дублікатів певного файлу, але ви можете просто перетиснути вихід на ім'я файлу:

fdupes -r1 .|grep filename

-rповторюється в каталогах і -1друкує кожну групу копій файлів в одному рядку.

Інші корисні приклади:

fdupes -r . знаходить усі повторювані файли в поточному каталозі;

fdupes -r . -dN видаляє всі, крім першого дубліката, з кожної групи дублікатів;

fdupes -r dir1 dir2|grep dir1/|xargs rmвидаляє дублікати в dir1.

Ви можете встановити за fdupesдопомогою brew install fdupes.


1
Чи можливо мати список файлів, які НЕ є дублікатом у поточному каталозі?
гагарин

7

Ви можете легко створити це самостійно за допомогою команд оболонки:

  • find ~ -type f -exec md5 -r '{}' \; > /tmp/md5.list

    створить список хедів md5 для всіх ваших файлів.

  • grep $(md5 -q FILE-TO-SEARCH) /tmp/md5.list

    буде шукати хеш md5 FILE-TO-SEARCH

Виконання першої команди (особливо, якщо ви виконайте її на всьому диску), але займе багато часу.


Якщо ви хочете шукати лише один файл, ви також можете використовувати

SIZE=$(stat -f '%z' FILE-TO-SEARCH)
MD5=$(md5 -q FILE-TO-SEARCH)
find ~ -type f -size ${SIZE}c | while read f; do
    [[ $MD5 = $(md5 -q "$f") ]] && echo $f
done

Найперший прохід повинен бути знахідкою за точним розміром операції.
biziclop

@biziclop Якщо ви хочете шукати лише один файл, так. Якщо ви хочете шукати декілька, то швидше побудувати індекс один раз, а потім просто пошукати файл індексу.
nohillside

1
Це, звичайно, правда, я щойно помітив це речення у запитанні: "Я б натомість зацікавився надсилати один файл і шукати його дублікати".
biziclop

fdupes має бути швидшим, щоб спочатку зробити порівняння дат, потім частковий хеш, потім повний хеш.
гагарин

1

Це має спрацювати, якщо ви заміните в команду розмір та хеш для FILE_001.

198452 байт - розмір файлу, який я використав, і хед файлу md5 - 3915dc84b4f464d0d550113287c8273b

find . -type f -size 198452c -exec md5 -r {} \; |
    grep -o "3915dc84b4f464d0d550113287c8273b\ \(.*\)" | awk '{print $2}'

Виведенням буде список файлів з іменами шляху відносно каталогу, надісланого команді find.

Перевага цього підходу полягає в тому, що він буде мати лише хеш-файли, що відповідають розміру оригіналу, і виводить лише імена файлів, які відповідають хешу.


0

Якщо ви не хочете возитися зі сценаріями, ви можете наблизитись до поведінки, яку ви хочете, за допомогою Araxis Find Duplicate Files $ 10 в магазині додатків Mac . На їхньому веб-сайті також є демонстрація 7 днів. Знайти копії файлів, які шукають дупи, обчислюючи хеш для кожного файлу.

Ви можете наблизити поведінку, яку ви хочете, щоб ви створили папку з єдиним файлом, який вас турбує, а потім додати папки, в яких ви хочете шукати. Це також повідомить про інші копії, якщо такі є, у шляхах пошуку.

Ця програма має багато приємних функцій сортування, що робить результати дуже зрозумілими.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.