1

Есть ли способ получить хеш-значение в качестве ввода при поиске файлов и полный список файлов и их расположения в качестве вывода?

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

Например, у меня может быть куча файлов на переносном жестком диске, а также бумажные копии этих файлов на внутреннем жестком диске настольного компьютера ... но я не уверен в их местонахождении! Теперь, если файлы не переименованы, я могу выполнить поиск по имени файла, чтобы попытаться найти печатную копию на рабочем столе. Затем я могу сравнить их рядом, и в случае, если они совпадают, я могу удалить имеющуюся копию на переносном жестком диске. Но если файлы были переименованы на одном из жестких дисков, это, вероятно, не сработает (в зависимости от того, насколько новые имена отличаются от оригинальных).

Если файл переименован, но не отредактирован, я мог бы вычислить его хеш-значение, например, значение SHA1 равно 74e7432df4a66f246b5214d60b190b67e2f6ce52 . Затем я хотел бы использовать это значение в качестве входных данных при поиске файлов, чтобы операционная система выполняла поиск по заданному каталогу или по всей файловой системе для файлов с этим точным значением хеш-функции SHA1 и выводила полный список мест, где эти файлы хранятся.

Я использую Windows, но мне, как правило, интересно знать, как можно добиться чего-то подобного, независимо от операционной системы.

6 ответов6

1

Это интригующий вопрос. Я использовал инструмент под названием fdupes, чтобы сделать что-то подобное. Fdupes будет рекурсивно искать по каталогам и сравнивать каждый файл с любым другим файлом. Сначала он сравнивает размер, и если размеры идентичны, то он создает хэши файлов и сравнивает их с тем, что если они одинаковы, то фактически проходит каждый байт за байтом и сравнивает его.

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

Некоторые недостатки fdupes заключаются в том, что, насколько я знаю, это только Linux, и, поскольку он сравнивает каждый файл с каждым другим файлом, для его запуска требуется немало времени ввода-вывода и времени. Он не "ищет" файл, скажем, но перечисляет все файлы с одинаковым хешем.

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

Исходная страница Fdupes

1

Мне нравится использовать простые инструменты, которые у меня уже есть, так что вот способ сделать это с помощью Windows PowerShell (так что он, очевидно, работает только на Windows). Это на самом деле небольшая правка на ответ Алекса К. Однако вопрос заключался в том, как искать с использованием хэшей, тогда как его ответ искал копию определенного файла.

Get-ChildItem "_search_location_" -Recurse | Get-FileHash | Where-Object hash -eq _hash_here_ | Select path

Просто замените _search_location_ на каталог, который вы хотите найти, и замените _hash_here_ на хеш файла, который вы хотите найти.

0

Существует инструмент ($) под названием FileLocator Pro, который может выполнять поиск по хэшу файла (SHA-x или MD5).

Выдержка из этой страницы:http://www.mythicsoft.com/filelocatorpro/help/en/advanced_criteria.htm

Примечание. Если для типа выражения установлено значение «Хэш файла», то содержащее текстовое поле может содержать разделенный запятыми список значений хеш-функции или указатель на файл, содержащий список значений хеш-функции, например

5A9C9B42A16F5E1985B7B0A019114C7A, 675C9B42A16F5E1985B7B0A019114C7A

или же,

= C:\FileHashTable.txt

Фактические алгоритмы, используемые для вычисления хеша, например, SHA1, MD5, указаны на вкладке «Параметры».

0

Вот пример для алгоритма MD5:

Get-ChildItem "_search_location_" -Recurse | Get-FileHash -Algorithm MD5 | Where-Object hash -eq _hash_here_ | Select path

Замените _search_location_ на каталог, который вы хотите найти, и замените _hash_here_ на хеш файла, который вы хотите найти.

Если вы хотите искать хеш, кроме хэша sha256, добавьте -Algorithm _algorithm_ после Get-FileHash где _algorithm_ - выбранный алгоритм.

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

0

Если у вас PowerShell v.4.0 или выше, вы можете использовать команду:

Get-ChildItem _search_location_ -Recurse | Get-FileHash | 
Where-Object hash -eq (Get-FileHash _search_file_).hash | Select path

Где _search_location_ - это папка или диск, где вы хотите найти дубликат, а _search_file_ - это файл, в котором где-то есть дубликат. Вы можете поместить эту команду в цикл для поиска нескольких файлов или добавить | Remove-Item в конце строки для автоматического удаления дубликатов.

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

0

Пример Linux:

echo '74e7432df4a66f246b5214d60b190b67e2f6ce52' | { read hash ; find -type f -exec sh -c 'sha1sum "$1" | cut -f 1 -d " " | sed "s|^\\\\||" | grep -Eqi "$0"' "$hash" "{}" \; -print ; }

Этот код более сложный, чем вы думаете, потому что:

  • он предназначен для правильной обработки имен файлов с пробелами, символами новой строки, обратными слешами , цитатами, специальными символами и т. д. (измените -print на -print0 для дальнейшего их анализа);
  • он предназначен для принятия хешей в качестве регулярного выражения (совместимо с grep -E например egrep),
    например, '(^00)|(00$)' будет совпадать, если хеш файла начинается или заканчивается на 00 .

Вы можете использовать другие инструменты *sum с совместимым интерфейсом (например, md5sum).

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