返回

使用 Inotifywait 如何排除指定目录监控文件夹?

Android

如何用 Inotifywait 监控排除指定目录的文件夹

问题:

监控文件夹时,我希望排除某些特定目录。然而,我发现 Inotifywait 无法识别我的排除列表,导致它监视了我不想监视的目录。

解决方案:

经过一番研究,我找到了一个解决方案,既简单又有效:使用 eval 命令来执行 Inotifywait 命令。通过这种方法,我可以顺利地排除我指定的目录。

使用 Eval 来排除目录

使用 eval 命令,我可以动态地构建 Inotifywait 命令,并根据需要将排除目录列表注入到命令中。以下是修改后的脚本片段:

eval $(echo inotifywait -t 10 -r -e modify $exc "$p1")

在这个命令中,exc 是我想要排除的目录列表。通过使用 eval,我可以将 exc 的值直接插入到 Inotifywait 命令中。

其他注意事项:

除了使用 eval 之外,我还在脚本中进行了其他一些改进:

  • 避免在 Inotifywait 命令中使用单引号。单引号会导致 Inotifywait 将排除目录列表解释为文本字符串,而不是变量。
  • 优化排除命令以避免 globbing。globbing 是 Bash 中的一个特性,它会扩展通配符(例如 * 和 ?)。为了提高脚本的效率和可读性,我将排除命令优化为更简洁的形式。

完整脚本:

以下是我修改后的完整脚本:

#!/bin/bash

# 排除目录列表
exc="/data/local/tmp/1/|/data/local/tmp/2/"

# 创建要监控的目录
mkdir -p /data/local/tmp/1 /data/local/tmp/2

# 优化排除命令以避免 globbing
exc=$(sed 's@|@/*|@g; s@/$@/*@' <<<"$exc")

# 监控文件夹,排除指定目录
inotifywait -t 10 -r -e modify --exclude "$exc" "/data/local/tmp" &

# 等待 inotifywait 进程结束
wait $!

常见问题解答:

  1. 我需要使用哪个版本的 Inotifywait?
    您需要使用 3.22.6.0 或更高版本的 Inotifywait。

  2. 如何指定要排除的目录?
    使用 --exclude 选项,后跟排除目录的完整路径。

  3. 为什么我需要使用 eval 命令?
    eval 命令允许您动态地构建 Inotifywait 命令,并根据需要将排除目录列表注入到命令中。

  4. 如何避免 globbing?
    您可以使用 sed 命令将排除目录列表转换为一种格式,避免 globbing。

  5. 我可以使用此脚本监控远程目录吗?
    是的,您可以使用 sshfs 或类似工具将远程目录挂载到本地系统,然后使用此脚本监控挂载的目录。