这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
.
grep
grep
--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" {} +