想象一下目录树(在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
。我存储了这些信息。然后,更改某些文件或目录/(字面上更改或新创建或删除)。使用先前确定和存储的信息,我现在想要弄清楚已经改变了什么。
到目前为止我的解决方案:我遍历整个树,然后查找已更改的元信息,然后处理它。超过一定大小,遍历树并查看每个目录和文件变得非常耗时 - 即使您只查看纯元信息(即ctime,mtime等,不是文件内容校验和)。人们可以仅在一定程度上优化这种遍历(例如,在遍历期间实际上仅在文件和文件夹上读取元信息而不是多次等) - 在一天结束时I / O速度成为瓶颈。
问题:我有什么选择(在Unix / Linux文件系统上)来查找树中的更改而不遍历所有更改? I.e。是否存储了demo
的任何信息,它告诉我/以某种方式表明其下面的某些内容(例如somefile_1b
)已被更改? 是否有任何特定的文件系统(EXT *,XFS,ZFS,...)提供此类功能?
注意:I am aware of the option of running a background process for monitoring changes to the filesystem.它不需要对我的树进行完全遍历,尽管我对不需要后台监视过程的选项更感兴趣(如果存在这种选项的话)。
答案 0 :(得分:1)
ZFS通过zfs diff ...
每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快照以有效地使用它。