inotifywait 忽略新目录

inotifywait 忽略新目录

我想忽略启动时尚未创建的目录inotifywait。我有一个空目录test

ubuntu@foo:~$ ls -lah test/
total 8.0K
drwxrwxr-x  2 ubuntu ubuntu 4.0K Sep  5 20:00 .
drwxr-x--- 13 ubuntu ubuntu 4.0K Sep  5 19:56 ..

我是inotifywait这样开始的:

ubuntu@foo:~$ inotifywait -mr -e CREATE -e MODIFY -e DELETE -e MOVE /home/ubuntu/test/ @/home/ubuntu/test/log
Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.

然后,在另一个终端中,我创建一个目录log并在其中放置一些内容:

ubuntu@foo:~/test$ mkdir log
ubuntu@foo:~/test$ cd log/
ubuntu@foo:~/test/log$ echo "foo" > foo

这是inotifywait输出:

/home/ubuntu/test/ CREATE,ISDIR log
/home/ubuntu/test/log/ CREATE foo
/home/ubuntu/test/log/ MODIFY foo

但是,如果我关闭脚本并再次启动它并将更多内容放入文件中,则不会触发任何事件。

是否可以忽略 inotifywait 中的“即将创建”目录?

答案1

@通过将排除前缀替换为--exclude具有简单模式(正则表达式)的选项,可以轻松完成此操作。例如,

--exclude /home/ubuntu/test/log'$'

通过添加$(匹配字符串结尾),我们确保创建的文件test/log2不会被错误匹配和排除。还要在开头添加 a^以确保我们不会匹配更深层次的路径:

--exclude '^'/home/ubuntu/test/log'$'

目录的排除足以排除其下的新文件,除非奇怪的是,该目录已经存在。为了应对这种情况,请将 替换$为替代的$/,即($|/)

--exclude '^'/home/ubuntu/test/log'($|/)'

然而,测试似乎表明(对于我的版本 3.14?)仅--exclude使用了最后一个选项,该选项没有记录,而且相当意外。因此,如果要排除多个目录,则需要将它们组合成一个正则表达式。如果您不熟悉语法,这不需要太复杂,只需将列表放在里面即可^(...|...|...)($|/),例如:

--exclude '^(/home/ubuntu/test/log|/home/abc/log|/usr/def)($|/)'

如果您的路径包含特殊的正则表达式字符,.[]^$()*+?|{},您需要查找如何转义它们。

相关内容