如何确定文件是否已在目录树中更改而不遍历整个树?

时间:2017-11-19 18:19:38

标签: linux unix filesystems inode directory-tree

想象一下目录树(在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.它不需要对我的树进行完全遍历,尽管我对不需要后台监视过程的选项更感兴趣(如果存在这种选项的话)。

1 个答案:

答案 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快照以有效地使用它。