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