【问题标题】:how to exclude multiple directories with pcregrep?如何使用 pcregrep 排除多个目录?
【发布时间】:2012-08-27 23:11:28
【问题描述】:

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

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

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

【问题讨论】:

    标签: regex linux bash pcre


    【解决方案1】:

    --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 标志。

    【讨论】:

    • @yegor256 pcregrep 可以轻松更改,以便它支持您想要的。请参阅我的更新答案。
    猜你喜欢
    • 2014-11-07
    • 2019-12-23
    • 2017-05-14
    • 2013-07-26
    • 1970-01-01
    • 2015-03-20
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    相关资源
    最近更新 更多