Есть ли способ поиска файлов по значению хэш-функции?

Есть ли способ поиска файлов по значению хэш-функции?

Можно ли использовать хэш-значение в качестве входных данных при поиске файлов и полный список файлов и их местоположений в качестве выходных данных?

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

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

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

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

решение1

Пример для Linux:

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

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

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

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

решение2

Если у вас 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в конце строки для автоматического удаления дубликатов.

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

решение3

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

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

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

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

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

решение4

Voidtools Everything 1.5 (Альфа)Инструмент поиска для Windows имеет возможность добавлять столбец различных хэшей, таких как CRC-32, CRC-64, MD5, SHA-1, SHA-256 для каждого файла.

введите описание изображения здесь

Затем вы также можете выполнить поиск по определенному хешу, напримерmd5:71E.. введите описание изображения здесь

Связанный контент