我在目录树中寻找字符串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)。


当前回答

试试这个:

 $ find . -name "*.txt" -type f -print | xargs file | grep "foo=" | cut -d: -f1

创立于:http://www.unix.com/shell-programming-scripting/42573-search-files-excluding-binary-files.html

其他回答

在grep 2.5.1中,您必须将这一行添加到~/。Bashrc或~/。bash配置文件

export GREP_OPTIONS="--exclude=\*.svn\*"

git grep

使用git grep,它针对性能进行了优化,旨在搜索特定的文件。

默认情况下,它忽略二进制文件,并尊重你的.gitignore。如果你不使用Git结构,你仍然可以通过传递——no-index来使用它。

示例语法:

git grep --no-index "some_pattern"

更多示例请参见:

如何排除某些目录/文件从git grep搜索。 检查文件中是否存在多个字符串或正则表达式

适用于TCSH .alias文件:

alias gisrc 'grep -I -r -i --exclude="*\.svn*" --include="*\."{mm,m,h,cc,c} \!* *'

花了我一段时间才弄清楚{mm,m,h,cc,c}部分不应该在引号内。 ~基斯

建议的命令:

grep -Ir --exclude="*\.svn*" "pattern" *

在概念上是错误的,因为——exclude作用于basename。换句话说,它将只跳过当前目录中的.svn。

如果非递归搜索,则可以使用glop模式来匹配文件名。

grep "foo" *.{html,txt}

包括HTML和txt。它只在当前目录中搜索。

在子目录中搜索:

   grep "foo" */*.{html,txt}

在子目录中:

   grep "foo" */*/*.{html,txt}