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