使用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 include,grep include exclude,grep exclude和variants找不到任何相关的东西

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


使用shell globbing语法:

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

--exclude的语法是相同的。

请注意,星号用反斜杠转义以防止它被shell扩展(引用它,例如--include="*.{cpp,h}" ,也可以工作)。 否则,如果您在当前工作目录中有与该模式匹配的任何文件,命令行将扩展为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="
链接地址: http://www.djcxy.com/p/1283.html

上一篇: Use grep

下一篇: How can I "pretty" format my JSON output in Ruby on Rails?