【问题标题】:Uniquely identify files唯一标识文件
【发布时间】:2012-08-21 17:19:45
【问题描述】:

我想在本地数据库中索引文件,但我不明白如何识别每个单独的文件。例如,如果我将文件路径存储在数据库中,那么如果文件被移动或删除,则该条目将不再有效。我想无论文件发生什么情况,都有某种方法可以唯一标识文件,但我在 Google 上没有成功。

这将特别适用于 *nix/Linux 和 ext4,所以请不要针对 windows 或 ntfs 或类似的东西。

【问题讨论】:

    标签: linux file filesystems


    【解决方案1】:

    除了上述出色的建议外,您还可以考虑使用文件的 inode number 属性,可以在带有 ls -i 的 shell 中查看。

    在我的一个盒子上使用 index.php:

    ls -i

    产量

    196237 index.php

    然后我使用mv index.php index1.php 重命名文件,之后同样的ls -i 产生:

    196237 index1.php

    (注意inode号是一样的)

    【讨论】:

    • +1 每天都能学到新东西,没想到你能做到。这在数据库中肯定会更小,然后存储整个路径。
    • 啊哈,我大致知道这存在,但我无法让谷歌给我任何相关的信息。非常感谢,我想这正是我所需要的。我很满意移动和修改文件的内容不会改变它的 inode 号。去寻找一些相关的 C 库!
    • inode 数量不够,还必须考虑设备 id,否则可能会发生冲突:stackoverflow.com/a/1289864/246207
    【解决方案2】:

    尝试使用诸如MD5SHA-1SHA-2 之类的散列方案,这些将允许您按内容匹配文件。

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

    编辑:正如 cmets 中所说,合并这两个数据是一个好主意,这样您就可以更准确地跟踪更改

    【讨论】:

    • +1。您可能想做一些涉及文件名和散列的事情,而不仅仅是散列。仅散列的解决方案可以让系统识别不同位置的同一个文件,但阻止它在编辑后识别同一个文件。
    • 感谢您的回答。不幸的是,我认为散列文件不适合我的需要。当我说“唯一标识文件,无论它们发生什么”时,我的意思也是内容更改,我很抱歉也不清楚。
    • 我明白你的意思,inode 的方式是要走的路
    【解决方案3】:

    如果您不认为具有相同内容的文件相同并且只想跟踪移动/重命名的文件相同,那么使用其 inode 编号即可。否则你将不得不对内容进行哈希处理。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2012-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-19
        • 2021-10-30
        • 1970-01-01
        • 1970-01-01
        • 2013-11-19
        相关资源
        最近更新 更多