返回
使用 Inotifywait 如何排除指定目录监控文件夹?
Android
2024-03-17 11:28:23
如何用 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 $!
常见问题解答:
-
我需要使用哪个版本的 Inotifywait?
您需要使用 3.22.6.0 或更高版本的 Inotifywait。 -
如何指定要排除的目录?
使用 --exclude 选项,后跟排除目录的完整路径。 -
为什么我需要使用 eval 命令?
eval 命令允许您动态地构建 Inotifywait 命令,并根据需要将排除目录列表注入到命令中。 -
如何避免 globbing?
您可以使用 sed 命令将排除目录列表转换为一种格式,避免 globbing。 -
我可以使用此脚本监控远程目录吗?
是的,您可以使用 sshfs 或类似工具将远程目录挂载到本地系统,然后使用此脚本监控挂载的目录。