inotifywait - 排除正则表达式模式格式

时间:2011-10-30 05:48:52

标签: regex bash shell inotify

我正在尝试使用inotifywait来查看~/js目录下的所有 .js 文件;如何在以下命令中格式化我的正则表达式?

$ inotifywait -m -r --exclude [REGEX HERE] ~/js

正则表达式 - 根据手册页,应该是POSIX扩展正则表达式 - 需要匹配“除 .js ”结尾的所有文件,所以这些文件又可以被--exclude选项排除。

我已经尝试了(?!)环顾问题,但在这种情况下它似乎不起作用。任何想法或解决方法?非常感谢您对此问题的帮助。

6 个答案:

答案 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。由于某些原因,它们没有在手册页中记录。