使用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="
上一篇: Use grep
下一篇: How can I "pretty" format my JSON output in Ruby on Rails?
