想象一个目录树(在 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,...)提供此类功能?
注意:我知道运行后台进程以监视文件系统更改的选项。它将消除对我的树的完全遍历的需要,尽管我对不需要后台监视过程的选项更感兴趣(如果这种选项存在的话)。