2

我正在尝试从以下搜索结果中排除多个目录pcregrep

pcregrep --exclude_dir=^\./(foo/abc|bar/cde)$ --recursive --regex alpha .

换句话说,我想找到所有包含 的文件alpha,并且我想在搜索过程中忽略./foo/abc/*和文件。./bar/cde/*不起作用,目录没有被排除在外。怎么了?

4

1 回答 1

2

的模式--exclude_dir仅匹配目录名称,而不是整个路径。因此你不能/在模式里面。如果要排除的目录名称是唯一的,则可以使用:

pcregrep --exclude_dir='^abc|cde$' -r alpha .

请注意,您经常需要使用'或使用任何其他引用/转义机制来包围模式。在大多数情况下,您可以省略--regex=.

如果您zsh用作 shell 并设置了 EXTENDED_GLOB,则可以使用以下解决方案排除整个路径:

pcregrep alpha **/*~(foo/abc/*|bar/cde/*)(.)

但是,您请求的功能可以很容易地在 pcregrep 中实现:下载它的源代码(pcre 库)并更改

pcre_exec(exclude_dir_compiled, NULL, nextfile, nflen, 0, 0, NULL, 0)

在文件pcregrep.c

pcre_exec(exclude_dir_compiled, NULL, buffer,  (int) strlen(buffer), 0, 0, NULL, 0)

请注意,此更改不向后兼容。最好的方法是引入一个新--exclude_path标志。

于 2012-09-03T08:46:21.957 回答