协慌网

登录 贡献 社区

使用 grep --exclude /-include 语法不对某些文件进行 grep

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

grep -ircl "foo=" *

目录中还包含许多匹配 “foo =” 的二进制文件。由于这些结果无关紧要,并且拖慢了搜索速度,因此我希望 grep 跳过搜索这些文件(主要是 JPEG 和 PNG 图像)。我该怎么办?

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

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

搜索grep 包含grep 包含排除grep 排除和变体未找到任何相关内容

如果只在某些文件中有更好的 grepping 方式,我就全力以赴;移动有问题的文件不是一种选择。我不能只搜索某些目录(目录结构一团糟,到处都是东西)。另外,我什么也无法安装,因此必须使用通用工具(例如grep或建议的find )。

答案

使用 shell 全局语法:

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

--exclude的语法相同。

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

如果只想跳过二进制文件,建议您查看-I (大写 i)选项。它忽略二进制文件。我经常使用以下命令:

grep -rI --exclude-dir="\.svn" "pattern" *

对于我想要的任何模式,它都会递归搜索,忽略二进制文件,并且不会在 Subversion 隐藏文件夹中查找。在工作中,我将其别名为 “grepsvn”。

请看看ack ,它是专门为这些情况而设计的。您的例子

grep -ircl --exclude=*.{png,jpg} "foo=" *

用 ack 完成

ack -icl "foo="

因为 ack 缺省情况下不会在二进制文件中查找,而 - r 缺省情况下处于打开状态。如果只需要 CPP 和 H 文件,则只需

ack -icl --cpp "foo="