如何将文件与哈希码关联,并使用它在文件系统中的任何位置查找该文件

如何将文件与哈希码关联,并使用它在文件系统中的任何位置查找该文件

我想创建一个工具(一个 shell 脚本,或者可能是一个 Python 脚本)来生成哈希代码并将其关联到文件,然后能够使用该哈希来检索文件系统中的文件(打开父文件夹并突出显示该文件,和/或使用默认应用程序打开该文件)。

我习惯了类似的东西,因为我正在使用书目表,一种用于管理科学文章的数据库软件,仅在 MacOS 下运行。 BibDesk 使用类似的方法将 pdf 文件链接到数据库中的条目,这样,即使您更改文件名称或将其移动到文件系统中的其他位置,关联仍然有效。

另请参阅此回答相关问题。

答案1

当然,我无法查看 BibDesk 内部。然而,根据其功能描述,我想说它的主要工作是保存数据库。在该数据库中,它将哈希值与文件关联起来。

然后它会监视它应该监视的文件夹,并查找发生更改的文件。考虑到即使是大型个人文献数据库也不会有数百万个文件,即使重新扫描以验证其发现的文件的哈希值是否仍符合预期,也很难被注意到,特别是在后台完成时。

计算机文件系统上的文件是路径寻址的,而不是内容或哈希寻址的——每个附加的查找信息都需要单独存储。 (您可以在大多数文件系统中存储有关文件的附加信息,但要查找该信息,您需要知道文件的路径 - 因此无法解决您的问题。)

所以,你的答案有点误导——你不能使用文件的内容哈希从文件系统检索文件。 (当然,您可以将文件名更改为哈希值 - 但我认为这不是您的意思。)

但是,出于完整性原因,将哈希值保留在数据库中可能是个好主意(您可以在交付文件之前检查哈希值是否正确),并且正如您所说,如果您有能力跟踪文件更改或频繁重新扫描以进行重新发现原因。

答案2

您可以在 python 或 bash 中执行此操作。

哈希/值数据库可用于存储哈希和值。搜索 gdbm 工具和库。最初的工具起源于 BSD unix,gdbm 是 gnu 版本,现在它们通常不会在标准安装中分发。

我在 ubuntu (20.04) 上安装了 gdbmtool,sudo apt install gdbmtool以获得一个实用程序来帮助我使用 bash 创建哈希/值对数据库。我sha256sum再次起诉命令行实用程序来生成文件的哈希值。

我的目标与你的不同,因为我想要一个工具来检测相同的照片(然后是音乐),但我过去已重命名,以便我可以删除重复项,我还将它们全部放在一个目录下,所以我不不搜索整个文件系统。我从一个名为 的工具开始dedupe,但我发现它对于我的需求来说很麻烦。这是很久以前的事了,现在还有其他工具可以做同样的事情(fslint、dupeguru,...)。

除了数据库的初始创建之外,您还需要定期运行某些程序来在移动(重命名)文件时更新数据库,以设置新路径值、正确的新位置以及在出现新条目时添加新条目。

我认为您不想对文件名路径进行哈希处理,而是对文件的内容进行哈希处理,以便您可以检测在新位置找到的现有相同文件。

一旦获得文件的路径,就可以使用xdg-open命令行(或脚本)打开它。

如果您想针对同一散列跟踪多个路径,那么关系数据库可能sqlite更合适,因为这是不允许的键值数据库。但我有点偏离主题(Unix 和 Linux),如果我更进一步的话,我已经给了你一些 Unix 工具的名称,供你搜索和阅读,以帮助你继续前进。

答案3

如果我正确理解你的问题,你可以通过用户 xattrs 来实现这一点。在您使用的发行版中安装 attr 包。例如在 debian/ubuntu 中使用 command sudo apt install attr。然后阅读man attrman setfattr然后man getfattr 您可以使用这样的命令将哈希保存在文件扩展属性中。

setfattr -n user.md5sum -v $(md5sum test.bin | awk '{print $1}') test.bin

并用命令读取

getfattr -n user.md5sum  test.bin
# file: test.bin
user.foo="a7fd41d58563137a6f73e738008d9970"

注意属性名称必须以命名空间为前缀user.

相关内容