我正在尝试使用inotifywait
来查看~/js
目录下的所有 .js 文件;如何在以下命令中格式化我的正则表达式?
$ inotifywait -m -r --exclude [REGEX HERE] ~/js
正则表达式 - 根据手册页,应该是POSIX扩展正则表达式 - 需要匹配“除 .js ”结尾的所有文件,所以这些文件又可以被--exclude
选项排除。
我已经尝试了(?!)环顾问题,但在这种情况下它似乎不起作用。任何想法或解决方法?非常感谢您对此问题的帮助。
答案 0 :(得分:8)
inotifywait
没有包含选项,POSIX扩展正则表达式不支持否定。 (由FailedDev回答)
您可以修补inotify工具以获取--include
选项。但是你需要自己编译和维护它。 (由browndav回答)
更快的解决方法是使用grep
。
$ inotifywait -m -r ~/js | grep '\.js$'
但是如果将输出传递给另一个命令,请注意grep的缓冲。添加--line-buffered
以使其与while read
一起使用。这是一个例子:
$ inotifywait -m -r ~/js | grep '\.js$' --line-buffered |
while read path events file; do
echo "$events happened to $file in $path"
done
如果您只想查看现有文件,还可以使用find
生成文件列表。它不会观看新创建的文件。
$ find ~/js -name '*.js' | xargs inotifywait -m
如果您的所有文件都在一个目录中,您还可以使用ostrokach的建议。在这种情况下,shell扩展比find和xargs容易得多。但同样,它不会观看新创建的文件。
$ inotifywait -m ~/js/*.js
答案 1 :(得分:7)
我尝试了(?!)的事情
这个东西叫做负向前瞻,POSIX ERE不支持。
所以你必须以艰难的方式去做,即匹配你想要排除的所有东西。
e.g。
\.(txt|xml)
等。
答案 2 :(得分:3)
我在这里发布了一个补丁,它添加了--include和--includei选项,就像--exclude和--excludei的否定一样:
https://github.com/browndav/inotify-tools/commit/160bc09c7b8e78493e55fc9f071d0c5575496429
显然你必须重建inotifytools,这是相对未经测试的,但希望它可以进入主线,或者对后来遇到这篇文章的人有所帮助。
答案 3 :(得分:1)
如果您使用与shell相关的字符(包括()
),请确保引用regex命令。
虽然这有效:
inotifywait --exclude \.pyc .
这不是:
inotifywait --exclude (\.pyc|~) .
你必须引用整个正则表达式:
inotifywait --exclude '.*(\.pyc|~)' .
答案 4 :(得分:1)
您可以通过--exclude '\.[^j][^s]'
获取大部分内容来忽略文件,除非它们在文件名或路径中的某个位置包含.js
。如果将它与-r
结合使用,那么它将适用于任意级别的嵌套。
唯一的缺点是仍然会看到像test.js.old
这样的文件名,并且还会监视名为example.js/
的目录中的所有文件,但这可能不太可能。
你可以扩展这个正则表达式来解决这个问题,但我个人并不认为这些弊端足以让人担心。
答案 5 :(得分:0)
从3.20.1版本开始,inotifywait确实包含--include
和--includei
选项。
要查看它们,请运行inotifywait --help
。由于某些原因,它们没有在手册页中记录。