1
  1. проверять файлы с одинаковым расширением и одинаковым размером
  2. используйте некоторую хеш-функцию (md5, md6 предположим, что будет лучше)

Первый не очень надежен, потому что имя не является частью файла. Файл не может иметь расширения. Второй довольно медленный на больших файлах.

Я предполагаю, что есть несколько более эффективных методов.

2 ответа2

1

Более эффективным методом будет комбинация для предотвращения бесполезных сравнений:

  1. Группируйте файлы по размеру файла.
  2. Группируйте файлы на основе хеша начальных данных каждого файла.
  3. Сравните файлы в каждой хэш-группе друг с другом, используя хэш-функцию.

Размер начальных данных должен быть выбран достаточно большим, чтобы быть достаточно уникальным (не заголовок).

Возможно, вы захотите не проверять большие файлы полностью, а проверить меньшую часть и перечислить их как «большие файлы / возможные дубликаты» вместо "точных дубликатов" и предоставить возможность полной проверки.

Как упоминал Фогг, если вам нужно сделать это поведение регулярно:
Возможно, вы захотите обновить хэш-группу в базе данных каждый раз, когда файл был изменен ...

0

Нет более эффективных методов.

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

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

Вы можете вычислить контрольную сумму, которая, по сути, такая же, как указано выше, но (1) потребляет больше ЦП в простом двухфайловом случае и (2) значительно упрощает сравнение более двух файлов. Причина этого в том, что вы можете кэшировать контрольную сумму, чтобы вам не приходилось перечитывать каждый файл для каждого другого файла, вы просто сравниваете контрольные суммы.

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

Если ваша файловая система ZFS или другая ФС, которая проверяет суммы файлов или блокирует "нативно", вы можете эффективно сравнивать файлы, просто читая метаданные файловой системы.

Лучше всего при внедрении универсального поиска дубликатов использовать заранее подготовленное решение. Если вам нужно сделать это самостоятельно, вы должны отсканировать и проверить контрольные суммы всех файлов, вести базу данных результатов, а затем обновлять ее при изменении файлов (или периодически, если это лучше для вашего сценария). Проверка дубликатов становится простым и эффективным способом запроса базы данных.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .