![是否可以使用校验和而不是名称来搜索文件?](https://linux22.com/image/141823/%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E4%BD%BF%E7%94%A8%E6%A0%A1%E9%AA%8C%E5%92%8C%E8%80%8C%E4%B8%8D%E6%98%AF%E5%90%8D%E7%A7%B0%E6%9D%A5%E6%90%9C%E7%B4%A2%E6%96%87%E4%BB%B6%EF%BC%9F%20.png)
假设我想进行搜索以查明是否有一个与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
是的,这是可能的,但只能通过暴力方式,通过对系统中的所有文件进行校验和并将它们与您的签名进行比较。
(事实上,这就是文件去重器的工作原理,通过对所有文件进行校验和并寻找匹配项,这些匹配项是具有相同内容的文件的有力候选者。)
如果您考虑经常通过校验和查找文件,您可能需要创建一个将校验和映射到路径的索引,这可能会节省您经常重新计算这些校验和的工作。如果巧妙地实现此索引,您可能能够进行增量更新,只需对新文件或自上次扫描以来已更新的文件进行校验和即可。