小编典典

使用 grep --exclude/--include 语法不通过某些文件 grep

all

我正在foo=目录树的文本文件中查找字符串。它在一台普通的 Linux 机器上,我有 bash shell:

grep -ircl "foo=" *

目录中还有许多匹配的二进制文件"foo="。由于这些结果不相关并且会减慢搜索速度,因此我希望 grep 跳过搜索这些文件(主要是 JPEG 和 PNG
图像)。我该怎么做?

我知道有--exclude=PATTERNand--include=PATTERN选项,但是模式格式是什么?grep 的手册页说:

--include=PATTERN     Recurse in directories only searching file matching PATTERN.
--exclude=PATTERN     Recurse in directories skip file matching PATTERN.

grep includegrep include excludegrep exclude 和变体上搜索未找到任何相关内容

如果只有在某些文件中有更好的 grepping
方法,我完全赞成;移动有问题的文件不是一种选择。我不能只搜索某些目录(目录结构很乱,到处都是)。另外,我无法安装任何东西,所以我必须使用常用工具(如
grep 或建议的 find )。


阅读 222

收藏
2022-03-01

共1个答案

小编典典

使用 shell通配符语法

grep pattern -r --include=\*.cpp --include=\*.h rootdir

for 的语法--exclude是相同的。

请注意,星号用反斜杠转义,以防止它被外壳扩展(引用它,例如--include="*.cpp",也可以)。否则,如果您在当前工作目录中有与该模式匹配的任何文件,命令行将扩展为类似
grep pattern -r --include=foo.cpp --include=bar.cpp rootdir内容,它只会搜索名为foo.cppand的文件bar.cpp,这很可能不是您想要的。

2021-03-04 更新

我已经编辑了原始答案以删除使用大括号扩展,这是 Bash 和 zsh 等几个 shell 提供的一个功能,用于简化这样的模式;但请注意,大括号扩展不符合 POSIX
shell。

原来的例子是:

grep pattern -r --include=\*.{cpp,h} rootdir

搜索根目录中的.cpp所有文件。.h``rootdir

2022-03-01