有没有办法通过哈希值搜索文件?

有没有办法通过哈希值搜索文件?

有没有一种方法可以在搜索文件时将哈希值作为输入,并将完整的文件列表及其位置作为输出?

这在尝试确定文件重复项时可能会有所帮助。我经常发现自己有一堆文件,我知道它们已经存储在某个位置,但我不知道它们在哪里。它们本质上是重复的。

例如,我可以在便携式硬盘上保存一堆文件,在台式计算机的内置硬盘上也保存这些文件的硬拷贝……但我不确定它们的位置!现在,如果文件没有重命名,我可以进行文件名搜索,尝试在桌面上找到硬拷贝。然后我可以将它们并排比较,如果它们相同,我可以删除便携式硬盘上的副本。但如果文件在其中一个硬盘上被重命名,这可能行不通(取决于新名称与原始名称的差异有多大)。

如果文件被重命名但未被编辑,我可以计算其哈希值,例如 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 将递归搜索目录并将每个文件与其他文件进行比较。首先,它会比较大小,如果大小相同,则它会创建文件的哈希值并进行比较,如果哈希值相同,则实际上逐字节地浏览每个文件并进行比较。

当它找到所有真正相同的文件时,您可以让它做几件事。我让它删除重复文件并在其位置创建一个硬链接(从而节省我的硬盘空间),尽管您可以让它只输出重复文件的位置而不对它们执行任何操作。这是您询问的场景。

fdupes 的一些缺点是,据我所知,它只适用于 Linux,而且由于它会将每个文件与其他文件进行比较,因此需要相当多的 I/O 和时间来运行。它不是“搜索”某个文件,而是列出所有具有相同哈希值的文件。

我强烈推荐它,并且我将它设置为每天在 cron 作业中运行,这样我的数据就不会出现任何不必要的重复(当然,它不包括我的备份)。

Fdupes 源页面

答案4

Voidtools Everything 1.5(Alpha 版)Windows 的搜索工具有一个选项可以为每个文件添加一列各种哈希值,例如 CRC-32、CRC-64、MD5、SHA-1、SHA-256。

在此处输入图片描述

然后你也可以搜索特定的哈希,例如md5:71E.. 在此处输入图片描述

相关内容