我正在目录树的文本文件中寻找字符串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.cpp
和bar.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="