Linux 唯一标识文件

Linux 唯一标识文件,linux,file,filesystems,Linux,File,Filesystems,我想索引本地数据库中的文件,但我不知道如何识别每个文件。例如,如果我将文件路径存储在数据库中,则如果文件被移动或删除,则条目将不再有效。我想不管文件发生了什么事情,都有一种独特的识别文件的方法,但我在谷歌没有成功 这将特别适用于*nix/Linux和ext4,因此请不要特定于windows或ntfs或类似的内容。尝试使用散列方案,例如MD5,SHA-1,或SHA-2,这些将允许您按内容匹配文件 基本上,当您第一次创建索引时,您将散列所有要添加的文件。这个字符串非常适合判断两个文件是不同的还是相同

我想索引本地数据库中的文件,但我不知道如何识别每个文件。例如,如果我将文件路径存储在数据库中,则如果文件被移动或删除,则条目将不再有效。我想不管文件发生了什么事情,都有一种独特的识别文件的方法,但我在谷歌没有成功


这将特别适用于*nix/Linux和ext4,因此请不要特定于windows或ntfs或类似的内容。

尝试使用散列方案,例如
MD5
SHA-1
,或
SHA-2
,这些将允许您按内容匹配文件

基本上,当您第一次创建索引时,您将散列所有要添加的文件。这个字符串非常适合判断两个文件是不同的还是相同的。然后,当您需要查看其中一个文件是否已经在索引中时,对其进行散列,然后将生成的散列与已知散列表进行比较


<>编辑:正如评论中所说,把两个数据合并在一起是一个好主意,这样你可以更准确地跟踪变化

除了上面的优秀建议之外,你可以考虑使用文件的iNoDE号属性,在shell中可以看到“代码> ls -i。 在我的一个框上使用index.php:

ls-i

屈服

196237 index.php

然后,我使用
mv index.php index1.php
重命名该文件,之后相同的
ls-I
生成:

196237 index1.php


(注意,iNoD数是相同的)

< P>如果您不考虑相同内容的文件,只想跟踪移动/重命名的文件,那么使用它的iNoDE号就可以了。否则,您将不得不对内容进行散列。

唯一的美中不足之处是inode可以在删除后重新分配(取决于平台)-您需要记录文件创建时间戳以及设备id才能100%确定。使用windows及其用户文件属性更容易

+1。不过,您可能想做一些涉及文件名和散列的事情,而不仅仅是散列。仅使用散列的解决方案可以让系统在不同的位置识别相同的文件,但会阻止系统在编辑后识别相同的文件。谢谢您的回答。不幸的是,我认为散列文件不适合我的需要。当我说“无论发生什么情况,都能唯一地识别文件”时,我的意思是内容的更改,我很抱歉说得不清楚。我明白你的意思,inode方法就是这样,然后+1每天学习新的东西,我不知道你能做到这一点。这在数据库中显然会更小,然后存储整个路径。啊哈,我有一个普遍的想法,这是存在的,但我无法让谷歌给我任何相关的东西。非常感谢,我想这正是我需要的。我很满意,移动和修改文件内容不会改变其inode编号。去寻找一些相关的C库吧!inode编号不够,还必须考虑设备id,否则可能会发生冲突: