Linux Inotify监视具有一定深度的子目录?

Linux Inotify监视具有一定深度的子目录?,linux,inotify,Linux,Inotify,是否可以使用inotify将新创建的子目录中的文件监视到某个级别 假设有一个结构: /home/user1/data /home/user2/data ... 定期添加新用户 我们只想监视“data”目录中的数据,但不想监视新创建的子目录中的数据,例如,如果用户创建了“/home/user3/data/test\u uploads”,则不应该对其进行处理 如果我们将inotifywait与以下语法一起使用,它将只检查现有目录: inotifywait -m -e close_write /ho

是否可以使用inotify将新创建的子目录中的文件监视到某个级别

假设有一个结构:

/home/user1/data
/home/user2/data
...
定期添加新用户

我们只想监视“data”目录中的数据,但不想监视新创建的子目录中的数据,例如,如果用户创建了“/home/user3/data/test\u uploads”,则不应该对其进行处理

如果我们将inotifywait与以下语法一起使用,它将只检查现有目录:

inotifywait -m -e close_write /home/*/data/
如果我们在/home中创建新用户,它将不会被处理,因为inotify只扫描现有目录

有没有办法监视新添加的目录到某个级别,但不要使用
“-r”
选项,因为它将监视所有子目录


提前谢谢

inotifywait
--exclude
选项,但不幸的是,它没有
--include
选项,并且不支持扩展POSIX正则表达式,因此不可能只包含与给定模式不匹配的文件。请参阅中的详细信息

其他选择:

  • 您可以只
    grep
    输出
    inotifywait
    ,但这种方式无法避免监控所有不必要的子文件的开销

  • 您可以使用patched
    inotifywait
    --include
    选项,如上面链接的答案中所述

  • 您可以直接使用
    inotify
    API编写自己的程序,以便控制要监视的文件和要排除的文件。还有各种脚本语言的绑定,包括Python

  • 您可以使用各种
    inotify
    包装器,例如Python模块


下面是一个使用
watchdog
Python模块和repo脚本的示例

启动监视器:

创建文件和目录:

监视器输出将为:

created /home/user/data/bar
modified /home/user/data/bar
请注意,
/home/user/foo
/home/user/data/baz/qux
不匹配

如果需要按类型筛选事件:

  • 如果使用的是
    watchdemo.py
    ,请选中shell命令中的键入:

    ... \
    --command='[ "${watch_event_type}" = created ] && echo "${watch_src_path}"'
    
  • 如果您直接使用
    watchdog
    Python模块,请从所需方法派生自定义事件处理程序并覆盖所需的方法,例如,在创建的\u上


什么系统正在添加用户?哪个系统正在向数据目录添加文件?谢谢你,真的很有用!这种方法有两个问题:1)是否可以只监视“创建”的事件,而不监视“修改”的事件?目标是在创建文件时只收到一次通知2)如果我将--pattern='/home/*/data/*'的完整路径替换为--pattern='./*/data/*',则它不起作用,不确定为什么?提前谢谢!对于1),请参见更新的答案。对于2),请使用绝对路径尝试watchdemo的
--directory
选项谢谢!第一个选项工作出色,它显示“创建的”事件。但是第二个目录不起作用,我尝试了--directory,但它不识别标志,看起来它不存在。我尝试使用选项“directories/home/user”,但出现错误“OSError:Path不是目录”。看起来目录有问题directive@Igor我的错误。目录作为位置参数传递给
watchdemo
,不带选项。请参阅更新的答案。Hi@gavv,这种方法似乎有问题,因为文件在实际关闭之前报告为“已创建”。因此,它正在处理实际上没有完全写入的文件。是否有任何方法仅在文件完全写入并关闭后才对其进行处理?
created /home/user/data/bar
modified /home/user/data/bar
... \
--command='[ "${watch_event_type}" = created ] && echo "${watch_src_path}"'