Что наиболее эффективные методы состоят в том, чтобы искать дубликаты файлов?

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

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

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

1
задан 18.01.2011, 23:23

2 ответа

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

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

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

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

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

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

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

0
ответ дан 17.12.2019, 00:27

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

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

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

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

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

1
ответ дан 17.12.2019, 00:27

Теги

Похожие вопросы