我想忽略启动时尚未创建的目录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)($|/)'
如果您的路径包含特殊的正则表达式字符,.[]^$()*+?|{},
您需要查找如何转义它们。