使用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.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="
链接地址: http://www.djcxy.com/p/1283.html
上一篇: Use grep
下一篇: How can I "pretty" format my JSON output in Ruby on Rails?