Поиск дубликатов файлов в 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.


Возможно ли иметь список файлов, которые НЕ являются дубликатами в текущем каталоге?
Гагарин

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

Самый первый проход должен быть операцией поиска по точному размеру.
user188421

@biziclop Если вы хотите найти только один файл, да. Если вы хотите выполнить поиск по нескольким, быстрее создать индекс один раз, а потом просто выполнить поиск по файлу индекса.
nohillside

1
Это правда, конечно, я только заметил это предложение в вопросе: «Вместо этого мне было бы интересно отправить один файл и найти его дубликаты».
user188421

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 App Store . На их веб-сайте также есть 7-дневная демоверсия. Find Duplicate Files ищет дубликаты, вычисляя хеш для каждого файла.

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

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

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