观察inotifywait
目录,并尝试排除全部子目录被监视不是排除文件。
inotifywait -r -q --exclude <pattern> dir/
放什么进去<pattern>
?手册inotifywait
指定:
--exclude <pattern>
Do not process any events whose filename matches the specified POSIX extended regular expression, case sensitive.
没有-type
像 中的标志find
。我试过了,(^/)
但这似乎排除了所有内容。
非常感谢您的帮助。
答案1
由于该--exclude
选项仅对文件名起作用,因此没有直接的方法可以做到这一点。您可以尝试一些迂回的方法,例如使用find
来打印所有目录的名称:
inotifywait --exclude "echo -n (;$(find . -maxdepth 1 -mindepth 1 -type d -printf '%P|');echo )" .
请注意,我没有指定-r
,因为这会导致新创建的子目录也受到监视。
这可能会因一些特殊字符而中断。
您还可以尝试:
find . -maxdepth 1 -mindepth 1 -type d -printf '@%P\n' > list_of_directories
inotifywait --fromfile list_of_directories .
inotifywait
将排除list_of_directories
以 开头的任何文件或文件夹@
(所有文件或文件夹都以 开头)。
如果您使用inotifywait
递归选项,find
则可以通过删除-maxdepth
限制来列出所有嵌套子目录(也适用于第一个命令):
find . -mindepth 1 -type d -printf '@%P\n' > list_of_directories
inotifywait --fromfile list_of_directories . -r
保留-mindepth
以防止find
匹配.
,从而也排除当前目录。
答案2
只需使用--exclude '/\..+'
。这将忽略所有以点开头的文件。
(该.+
部分不会排除您的基本文件夹)。
答案3
inotifywait
由于参数,仅检查子目录-r
。
将其称为没有该参数,它将不会监视子目录。
答案4
我可以确认,这--exclude 'node_modules'
对于我来说可以完成工作,即使它node_modules
是一个子文件夹。
while inotifywait -rqq -e close_write --exclude 'node_modules' "$1"; do $2;$3;$4; done
也测试了这一点:
inotifywait --recursive --monitor --format "%e %w%f" \
--event modify,move,create,delete --exclude 'node_modules' ./ |
while read changed; do
sleep .2 && ./devrun
done