【发布时间】:2012-08-27 23:11:28
【问题描述】:
我正在尝试从pcregrep 的搜索结果中排除多个目录:
pcregrep --exclude_dir=^\./(foo/abc|bar/cde)$ --recursive --regex alpha .
换句话说,我想查找所有包含alpha 的文件,并且我想在搜索过程中忽略./foo/abc/* 和./bar/cde/* 文件。不起作用,目录没有被排除在外。怎么了?
【问题讨论】:
我正在尝试从pcregrep 的搜索结果中排除多个目录:
pcregrep --exclude_dir=^\./(foo/abc|bar/cde)$ --recursive --regex alpha .
换句话说,我想查找所有包含alpha 的文件,并且我想在搜索过程中忽略./foo/abc/* 和./bar/cde/* 文件。不起作用,目录没有被排除在外。怎么了?
【问题讨论】:
--exclude_dir 的模式只匹配目录名,而不匹配整个路径。
因此,您不能在模式中包含/。如果要排除的目录名是唯一的,可以使用:
pcregrep --exclude_dir='^abc|cde$' -r alpha .
请注意,您经常需要使用' 或使用任何其他引用/转义机制将模式括起来。大多数情况下,您可以省略--regex=。
如果您使用 zsh 作为您的 shell 并设置了 EXTENDED_GLOB,您可以使用以下解决方案来排除整个路径:
pcregrep alpha **/*~(foo/abc/*|bar/cde/*)(.)
但是,您请求的功能可以很容易地在 pcregrep 中实现: 下载其源代码(pcre library)并更改
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 标志。
【讨论】: