我想在本地数据库中索引文件,但我不明白如何识别每个单独的文件。例如,如果我将文件路径存储在数据库中,那么如果文件被移动或删除,则该条目将不再有效。我想无论文件发生什么情况,都有某种唯一标识文件的方法,但我在 Google 上没有成功。
这将特别适用于 *nix/Linux 和 ext4,所以请不要针对 windows 或 ntfs 或类似的东西。
我想在本地数据库中索引文件,但我不明白如何识别每个单独的文件。例如,如果我将文件路径存储在数据库中,那么如果文件被移动或删除,则该条目将不再有效。我想无论文件发生什么情况,都有某种唯一标识文件的方法,但我在 Google 上没有成功。
这将特别适用于 *nix/Linux 和 ext4,所以请不要针对 windows 或 ntfs 或类似的东西。
除了上面的优秀建议之外,您还可以考虑使用文件的 inode number 属性,可以在带有ls -i
.
在我的一个盒子上使用 index.php:
ls -i
产量
196237 index.php
然后我使用 重命名文件mv index.php index1.php
,之后产生相同的结果ls -i
:
196237 index1.php
(注意inode号是一样的)
尝试使用诸如MD5
,之类的散列方案SHA-1
,否则SHA-2
这些方案将允许您按内容匹配文件。
基本上,当您第一次创建索引时,您将对所有要添加的文件进行哈希处理。这个字符串非常擅长判断两个文件是不同还是相同。然后,当您需要查看其中一个文件是否已经在索引中时,对其进行哈希处理,然后将生成的哈希与您的已知哈希表进行比较。
编辑:正如评论中所说,合并两个数据是一个好主意,这样您就可以更准确地跟踪更改
如果您不认为具有相同内容的文件相同并且只想跟踪移动/重命名的文件相同,那么使用它的 inode 号就可以了。否则,您将不得不对内容进行哈希处理。
唯一美中不足的是 inode 可以在删除后重新分配(取决于平台) - 您需要记录文件创建时间戳以及设备 ID 以 100% 确定。使用 Windows 及其用户文件属性更容易。