是否可以使用校验和而不是名称来搜索文件?

是否可以使用校验和而不是名称来搜索文件?

假设我想进行搜索以查明是否有一个与test1.txt使用以下命令从文件生成的 sha256 相匹配的文件:

sha256sum -b test1.txt

我得到的输出是:

e3d748fdf10adca15c96d77a38aa0447fa87af9c297cb0b75e314cc313367daf * test1.txt

因此,我想找到与生成的校验和匹配的文件,而不是使用名称。

这可能吗?

答案1

find . -type f -exec sha256sum -b {} + | 
grep -F 'e3d748fdf10adca15c96d77a38aa0447fa87af9c297cb0b75e314cc313367daf'

这将计算当前目录中或下的每个文件的 SHA256 校验和。最后grep将提取与您正在查找的校验和相匹配的计算结果。

如果操作的结果find被转移到一个文件中,它可以充当一个“数据库”,您可以使用它对grep.如果添加了一些额外的逻辑,您可以创建一个 cron 作业,使用新文件和更新文件中的信息定期刷新此文件,并删除旧信息(这并不是这个问题的真正含义,所以我将保留任何代码暂且)。无需太多额外的努力,您甚至可以针对简单的 SQLite 数据库执行此操作。

相关命令语法find

答案2

通常情况下,您不会拥有包含每个文件的 sha256 和的数据库,因此唯一的方法是计算每个文件的 sha256 和(如果找到匹配项则停止)。这是一项非常繁重且耗时的操作,因此从实际目的来看,大多数情况下的答案是否定的。

答案3

是的,这是可能的,但只能通过暴力方式,通过对系统中的所有文件进行校验和并将它们与您的签名进行比较。

(事实上​​,这就是文件去重器的工作原理,通过对所有文件进行校验和并寻找匹配项,这些匹配项是具有相同内容的文件的有力候选者。)

如果您考虑经常通过校验和查找文件,您可能需要创建一个将校验和映射到路径的索引,这可能会节省您经常重新计算这些校验和的工作。如果巧妙地实现此索引,您可能能够进行增量更新,只需对新文件或自上次扫描以来已更新的文件进行校验和即可。

相关内容