从 inotifywait 中排除目录

从 inotifywait 中排除目录

观察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

相关内容