【问题标题】:Best approach to detecting a move or rename to a file in Linux?在 Linux 中检测文件移动或重命名的最佳方法是什么?
【发布时间】:2011-03-31 16:42:20
【问题描述】:

一些解决方案可能适用于 Windows,但是我不熟悉 Windows 操作系统,所以这将以 Linux 为重点。

据我了解,Unix文件系统都有inode的概念,就是存储文件系统元数据和“文件”的地方。因此我想知道是否可以使用带有一些附加信息的 inode 编号来跟踪重命名或移动的文件?

我建议做的是进行初始扫描,该扫描将创建一个包含文件名/路径、其所在磁盘/驱动器、其 inode 编号以及最后某种校验和 (sha-1) 的数据库。

这将使系统能够使用 inode 编号快速检测文件是否被移动或重命名,然后它会跟进校验和以检查它是否实际上是同一个文件。

我可以看到这个方案可能存在的一些问题:

  1. 文件可以被修改然后移动/重命名,这将无法检测到它,因为校验和不匹配。
  2. 某些(大多数?)应用程序在修改文件时会创建一个新的临时文件,然后将其切换为当前文件,因此即使文件最终未修改,inode 也不会匹配....
  3. 需要存储它所在的设备/文件系统,因为每个文件系统上的 inode 对于该文件系统都是唯一的。
  4. 需要处理硬链接

我想知道我在这里是否忘记了其他任何问题?我希望能够使用 inode 快速追踪哪些文件被移动或重命名,然后用校验和确认它实际上是同一个文件。

【问题讨论】:

  • 您是在谈论定期运行以扫描更改的程序,还是连续运行以监视更改的程序?如果是后者,有一个名为 inotify 的 Linux 内核子系统可以为您处理大部分繁重的工作:en.wikipedia.org/wiki/Inotify
  • 这将更像是定期扫描更改,我自己实际上已经考虑并查看了“inotify”子系统。这似乎有点矫枉过正,它需要始终运行,我主要想确定两个不同时间段内是否有任何移动或重命名的文件可以相隔数小时或数月。
  • 关于 inotify 的事情是它几乎不消耗资源,直到发生实际变化。鉴于大多数文件在您的扫描之间不会更改的文件系统,与重新扫描整个文件系统相比,这需要的资源要少得多
  • 我对 inotify 做了更多研究,看起来它可能会奏效,但我仍然对它有一些担忧。为了能够监视所有重命名/移动,它必须成为一个 24/7 运行的守护进程。但除了守护进程之外,它看起来实际上可能最终会成功。

标签: linux file inode


【解决方案1】:

查看inotify,它允许您在任何人对指定文件系统或目录中的文件执行任何操作时接到电话。

【讨论】:

    【解决方案2】:

    请注意,这将文件系统相关。它在 ext3 和类似的文件系统中是可行的,但在其他文件系统中可能不行。这可能也是一个相当资源消耗的操作,因为它需要扫描磁盘以检查所有 inode,因此您需要查找解决方案以在 inode 更改时收到通知(而不是扫描它们全部)。

    【讨论】:

    • 我认为大多数(如果不是全部)基于 Linux/Unix 的文件系统都有 inode 的概念,如果他们不使用它,他们就必须模仿它?显然,这不包括 Windows 或“替代”操作系统文件系统。
    【解决方案3】:

    logroate 使用mv 命令,有一篇文章解释了为什么文件移动时fd不改变 How do the UNIX commands mv and rm work with open files?

    【讨论】:

      猜你喜欢
      • 2010-09-06
      • 2019-01-26
      • 1970-01-01
      • 2011-04-26
      • 1970-01-01
      • 2021-06-07
      • 1970-01-01
      相关资源
      最近更新 更多