unix - 使用grep --exclude/--include 不能通过某些文件

  显示原文与译文双语对照的内容

在目录树的文本文件中查找字符串"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 还是建议找到 ) 。

的更新:@Adam Rosenfield的答案正是我想要的:


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

@rmeador的答案也是一个不错的解决方案:


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

它递归搜索,忽略二进制文件,并且不在Subversion隐藏文件夹中查找。( 。)

时间:

使用shell组合语法:


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

--exclude的语法相同。

注意,星号是用一个反斜杠转义的,以防止外壳程序扩展它。 否则,如果当前工作目录中有与模式匹配的文件,命令行 将扩展到类似 grep pattern -r --include=foo.cpp --include=bar.h rootdir 这将只搜索名为 foo.cppbar.h的文件,这很可能不是你想要的。

如果你只想跳过二进制文件,我建议你查看-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="

grep 2.5.3引入了--exclude-dir参数,它将按照你想要的方式工作。


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

你还可以设置环境变量: grep_options="--exclude-dir= 。svn"

我将第二个 安迪的投票支持 ack 虽然,它是最好的。

建议的命令:


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

在概念上是错误的,因为--exclude在原语上工作。 换句话说,它将只跳过当前目录中的. svn 。

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


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

但是,这并没有真正阻止它搜索二进制文件。

如果你不反对使用 find,我喜欢它的-prune 特性: yf_code_hryhezj6bifgm2lomqqfwzdjojswg5dpoj4v2ic4biqcaibaeaqcaibnnzqw2zjaejygc5dumvzg4x3un5pwk6ddnr2wizjceawxa4tvnzssaxakeaqcaibafvxsallomfwwkibcmfxg65dimvzf64dbor2gk4tol52g6x3fpbrwy5lemurcallqoj2w4zjalqfcaibaeaqc23zafvxgc3lfearhayluorsxe3s7orxv6skoingfkrcfeiqc24dsnfxhimbalqfhyidymfzgo4zafuycalkjebdestcfjzau2rjam5zgk4bafveveibcobqxi5dfojxceicgjfgektsbjvcqucr4f5yhezj6_yf_code

在第一行中,指定要搜索的目录。 . ( 当前目录) 是一个有效路径,例如。

在 2和 3行上,使用 "*.png""*.gif""*.jpg" 等。 使用其中的许多 -o -name"..." -prune 根据你的模式构造。

在 4行,你需要另一个 -o ( 它指定"或者"到 find ),你确实需要这些模式,并且需要在它的末尾有 -print 或者 -print0 。 如果你只想在修剪 *.gif*.png,等等 图像后保留"其他一切",那么使用 -o -print0,然后使用 4行。

最后,在 5行是通向 xargs的管道,它接受这些结果文件并将它们存储在一个变量 FILENAME 中。 然后通过 grep 传递 -IR 标志,"pattern",然后 FILENAMExargs 扩展,成为由 find 找到的文件名列表。

对于你的特定问题,语句可能类似于: yf_code_hryhezj6bifgm2lomqqc4ic4biqcaibaeaww4ylnmuqcekroobxgoirafvyhe5lomuqfycraeaqcaibnn4qc23tbnvssairkfztwszrceawxa4tvnzssaxakeaqcaibafvxsallomfwwkibcfixhg5toeiqc24dsovxgkic4biqcaibaeaww6ibnobzgs3tugaqhyidymfzgo4zafuycalkjebdestcfkmqgo4tfoaqc2skseargm33phurcarsjjrcvgcqkhqxxa4tfhy888888_yf_code

...