11

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

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

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

我已经尝试过 (?!) 环顾四周的事情,但在这种情况下它似乎不起作用。有什么想法或解决方法吗?非常感谢您在这个问题上的帮助。

4

6 回答 6

9

我已经尝试过(?!)的事情

这个东西被称为负前瞻,POSIX ERE 不支持它。

因此,您必须以艰难的方式进行,即匹配您想要排除的所有内容。

例如

\.(txt|xml)等等

于 2011-10-30T06:00:26.963 回答
8

inotifywait没有包含选项,POSIX 扩展正则表达式不支持否定。(由FailedDev回答)

您可以修补 inotify 工具以获得--include选项。但是你需要自己编译和维护它。(布朗达夫回答)

更快的解决方法是使用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
于 2016-07-10T04:22:56.190 回答
4

我在这里发布了一个补丁,其中添加了 --include 和 --includei 选项,它们的作用类似于 --exclude 和 --excludei 的否定:

https://github.com/browndav/inotify-tools/commit/160bc09c7b8e78493e55fc9f071d0c5575496429

显然,您必须重建 inotifytools,这是相对未经测试的,但希望它可以进入主线,或者对以后遇到这篇文章的人有所帮助。

于 2013-10-18T17:28:44.863 回答
2

从 3.20.1 版本开始,inotifywait 确实包含--include--includei选项。

要查看它们,请运行inotifywait --help. 出于某种原因,它们没有记录在手册页中。

于 2019-09-09T18:26:55.937 回答
1

您可以通过忽略文件来获得大部分内容,--exclude '\.[^j][^s]'除非它们包含.js在文件名或路径中的某个位置。如果将它与-rthen 结合使用,它将适用于任意级别的嵌套。

唯一的缺点是文件名 liketest.js.old仍将被监视,并且目录中的所有文件example.js/也将被监视,但这可能不太可能。

您可能可以扩展这个正则表达式来解决这个问题,但我个人认为这些缺点不足以让人担心。

于 2016-08-31T03:20:40.227 回答
1

()如果您使用的是与 shell 相关的字符(包括),请确保引用了 regex 命令。

虽然这是有效的:

inotifywait --exclude \.pyc .

这不是:

inotifywait --exclude (\.pyc|~) .

您必须引用整个正则表达式:

inotifywait --exclude '.*(\.pyc|~)' .
于 2016-02-03T08:46:13.140 回答