【问题标题】:How to determine the uniqueness of a file in linux?linux下如何判断文件的唯一性?
【发布时间】:2012-11-01 07:10:14
【问题描述】:

我这里所说的“独特性”也与时间有关。

  • 每次在文件系统上创建一个文件,都有一个唯一的文件。
  • 同一目录下同名但出现时间不同的文件 阶段不同。
  • “唯一”的定义与文件内容无关。

首先,我使用 inode 来识别文件,不同 inode 的文件是不同的,文件在其生命周期内总是有一个固定的 inode,即使它被移动和触摸。

但是,索引节点可能会被操作系统重用。如果文件 A.txt 有 inode 22345,如果我删除 A.txt 并创建 B.txt,B.txt 可能在 ode 22345 中。

如果有文件的创建时间怎么办?这样我就可以使用 inode+creation-time 来识别文件系统历史记录中的文件。但是 linux 没有提供。

我也尝试了inode+file_md5,但是如果A.txt和B.txt的内容相同呢?

那么,你有什么想法吗?

===========编辑===========

我的场景是一种日志文件收集。在日志目录中,可以创建、移动和删除日志文件。我们使用从文件偏移量到时间戳的映射来做一些“检查点”之类的工作。那么如何玷污刚才提到的“文件”呢?

【问题讨论】:

  • 如果具有相同的内容不会使它们成为相同的文件,那是什么?我可以想象这个问题的答案,但我认为你需要澄清一下。
  • 如果 A.txt 是指向 B.txt 的硬链接,您会将它们解释为不同的文件吗?
  • 如果文件 A.txt 已更新(写入附加)它是您定义中的新文件?
  • 我假设如果文件具有相同的 inode 相同的内容相同的名称和相同的 mtime 它是您定义中的 uniq 文件
  • 感谢您的澄清。我想我应该问,为什么你需要使用这个独特的定义?该问题被标记为 inotify;您是否担心涉及过时的 inotify 事件的竞争条件?

标签: linux inotify inode


【解决方案1】:

通常除了 inode 编号之外,第一还比较设备编号,因为两个不同文件系统上的两个文件可能具有相同的 inode 编号。

无论如何,比较 inode/dev 编号是回答“这两个文件描述符是否引用同一个文件?”问题的一种方法。请注意问题中使用“文件描述符”而不是“路径”,如果在其中的 stat()' 之后和比较 inode/dev 编号之前随后删除了路径,则可以避免竞争。正如您自己指出的那样,只有当它们具有活动引用(路径和/或它们被某个进程打开)时,inode 编号才能保证是唯一的。

在您的情况下,我想一种解决方案是跟踪您感兴趣的文件的 inode/dev 编号,如果文件被删除,则从列表中删除。虽然我不确定你真正想要完成什么。

【讨论】:

    猜你喜欢
    • 2021-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    • 2020-09-21
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    相关资源
    最近更新 更多