【问题标题】:How to determine whether files have been changed in a directory tree without traversing the entire tree?如何在不遍历整个目录树的情况下确定目录树中的文件是否已更改?
【发布时间】:2018-05-02 23:36:28
【问题描述】:

想象一个目录树(在 Linux 上):

user@computer:~/demo> find .
.
./test1
./test1/test1_a
./test1/test1_a/somefile_1a
./test1/test1_b
./test1/test1_b/somefile_1b
./test0
./test0/test0_a
./test0/test0_a/somefile_0a
./test0/test0_b
./test0/test0_b/somefile_0b

场景:我确定了该树中每个目录和文件的所有可用元信息(mtime、ctime、inode、大小、文件内容的校验和...),包括最高级别的目录demo。我存储这些信息。然后,一些文件/s 或目录/ies 被更改(字面上更改或新创建或删除)。使用先前确定和存储的信息,我现在想弄清楚发生了什么变化。

到目前为止我的解决方案:我遍历整个树,然后查找更改的元信息,然后对其进行处理。超过一定大小,遍历树并查看每个目录和文件变得非常耗时 - 即使您只查看纯元信息(即 ctime、mtime 等,而不是文件内容校验和)。人们只能在一定程度上优化这种遍历(例如,在遍历期间实际上只读取文件和文件夹的元信息一次,而不是多次等)——最终,I/O 速度成为瓶颈。

问题:我有哪些选项(在 Unix/Linux 文件系统上)可以在不遍历所有树的情况下查找树中的更改?即是否有为demo 存储的任何信息告诉我/以某种方式表明它下面的某些内容(例如somefile_1b)已被更改? 是否有任何特定的文件系统(EXT*、XFS、ZFS,...)提供此类功能?

注意:I am aware of the option of running a background process for monitoring changes to the filesystem. 这将消除对我的树的完全遍历的需要,尽管我对不需要后台监控过程的选项更感兴趣(如果这种选项存在的话)。

【问题讨论】:

  • @Vasan 部分是的,是的,尽管实际上可能有文件系统将其作为一项功能提供......(由于某些行为,可能是通过后门)。
  • 请注意,使用任何类型的监视进程都不会检测到在监视进程未运行时所做的更改。所以它本质上是不可靠的。

标签: linux unix filesystems inode directory-tree


【解决方案1】:

ZFS 通过zfs diff ... Per the Oracle Solaris 11.2 documentation 提供该功能:

识别 ZFS 快照差异 (zfs diff)

您可以使用zfs diff 确定 ZFS 快照差异 命令。

例如,假设创建了以下两个快照:

$ ls /tank/home/tim
fileA
$ zfs snapshot tank/home/tim@snap1
$ ls /tank/home/tim
fileA  fileB
$ zfs snapshot tank/home/tim@snap2

例如,要识别两个快照之间的差异,请使用 语法类似如下:

$ zfs diff tank/home/tim@snap1 tank/home/tim@snap2
M       /tank/home/tim/
+       /tank/home/tim/fileB

在输出中,M 表示目录已被修改。 + 表示 fileB 存在于后面的快照中。

以下输出中的 R 表示快照中的文件具有 改名了。

$ mv /tank/cindy/fileB /tank/cindy/fileC
$ zfs snapshot tank/cindy@snap2
$ zfs diff tank/cindy@snap1 tank/cindy@snap2
M       /tank/cindy/
R       /tank/cindy/fileB -> /tank/cindy/fileC

这仅在两个快照之间进行比较,因此您必须能够创建 ZFS 快照才能有效地使用它。

【讨论】:

  • 这很有趣,非常感谢。我不知道实际上可以区分 ZFS 快照。它表明 btrfs 实际上可能具有类似的差异功能,但乍一看,我找不到它。 (在 ZFS 的情况下,我会对其进行基准测试......有兴趣看看它有多快/多慢。)
  • @s-m-e ZFS 的diff 功能没有列出on the ZFS Wiki page,所以我不确定它是什么时候引入的,也不确定它是否在 OpenZFS 中可用。 OpenZFS wiki 本身似乎已经过时了。它可能未列出,因为它一直可用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-26
  • 1970-01-01
  • 2015-06-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多