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


当前回答

我发现grepping grep的输出有时非常有用:

grep -rn "foo=" . | grep -v "Binary file"

不过,这实际上并没有阻止它搜索二进制文件。

其他回答

请看看ack,它正是为这些情况而设计的。你的例子

grep -ircl --exclude=*.{png,jpg} "foo=" *

ack as完成了吗

ack -icl "foo="

因为ack在默认情况下从不在二进制文件中查找,而-r在默认情况下是打开的。如果您只想要CPP和H文件,那么就这样做

ack -icl --cpp "foo="

这些脚本并不能解决所有的问题……试试这个吧:

du -ha | grep -i -o "\./.*" | grep -v "\.svn\|another_file\|another_folder" | xargs grep -i -n "$1"

这个脚本非常好,因为它使用“真正的”正则表达式来避免目录搜索。只需在grep -v上用“\|”分隔文件夹或文件名即可

享受它! 在我的Linux shell上找到!XD

建议的命令:

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

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

Grep 2.5.3引入了——exclude-dir参数,它将以您想要的方式工作。

grep -rI --exclude-dir=\.svn PATTERN .

你也可以设置一个环境变量:GREP_OPTIONS="——exclude-dir=\.svn"

不过我支持安迪投ack,这是最好的。

我是一个业余爱好者,这是我的~/。bash_profile看起来:

export GREP_OPTIONS="-orl --exclude-dir=.svn --exclude-dir=.cache --color=auto" GREP_COLOR='1;32'

注意,要排除两个目录,我必须使用——exclude-dir两次。