使用 grep 正则表达式排除两种目录

使用 grep 正则表达式排除两种目录

SE 的答案让我意识到我可以使用正则表达式和 grep 来排除目录。但使用时它对我不起作用|

results=$(grep --color=always -rnF "$searchTerm" . --exclude-dir='.[^.]*|node_modules')
results=$(grep --color=always -rnF "$searchTerm" . --exclude-dir='.[^.]*\|node_modules')

是否有另一种方法来编写此正则表达式,以便排除以句点和 node_modules 开头的目录?

答案1

至少对于 GNU grep 来说,--exclude似乎需要一个全局模式而不是正则表达式 - 您链接问题的答案暗示了它所说的内容“请注意,pcregrep 和 grep 中 --exclude-dir 的含义是不同的。详细信息请阅读相应的手册。”。具体来说:

man grep

  --exclude-dir=GLOB
          Skip any command-line directory with a name suffix that  matches
          the   pattern   GLOB.   When  searching  recursively,  skip  any
          subdirectory whose base name matches GLOB.  Ignore any redundant
          trailing slashes in GLOB.

man pcregrep

   --exclude=pattern
             Files (but not directories) whose names match the pattern are
             skipped  without  being processed. This applies to all files,
             whether listed on the command  line,  obtained  from  --file-
             list, or by scanning a directory. The pattern is a PCRE regu‐
             lar expression, and is matched against the final component of
             the  file  name,  not the entire path.

至少在 GNU grep 中,--exclude-dir如果您想排除多个模式,则可以多次使用:

--exclude-dir='.?*' --exclude-dir='node_modules'

我已将其更改.[^.]*.?*

  • 没有必要尝试不排除这是否是意图,因为您正在此处的当前目录中进行搜索(省略默认为最新版本的 GNU 的..目标文件,除了我发现至少在 GNU 3.11 中,甚至失败排除它,所以如果您没有指定任何目标目录,那么该版本就足够了)。-r.grepgrep--exclude-dir='*'--exclude-dir='.*'
  • 这将无法排除名为..foo或 的目录...
  • 正则表达式的 POSIX glob 等效项[^.][!.](尽管[^.]至少在 GNU 系统上通常也受支持)。

答案2

为什么不使用find

tree -a
.
├── node_modules
│   ├── a
│   ├── b
│   └── c
├── .test
│   ├── 1
│   ├── 2
│   └── 3
└── x
    ├── 001
    └── 002

3 directories, 8 files

find . \( ! -path './node_modules*' -a ! -path './.*' \)
.
./x
./x/002
./x/001

最后:

find . \( ! -path './node_modules*' -a ! -path './.*' \) \
    -exec grep --color=always -nF "$searchTerm" {} +

相关内容