当前位置:  开发笔记 > 编程语言 > 正文

使用grep --exclude/ - include语法不要浏览某些文件

如何解决《使用grep--exclude/-include语法不要浏览某些文件》经验,为你挑选了11个好方法。

我正在寻找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没有找到任何相关内容

如果有一种更好的方法只在某些文件中进行grepping,我就是全力以赴; 移动违规文件不是一种选择.我不能只搜索某些目录(目录结构很乱,随处可见).另外,我无法安装任何东西,所以我必须使用常用工具(如grep或建议的查找).



1> Adam Rosenfi..:

使用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.cppbar.h,这是很可能你想不是.


我不知道为什么,但我不得不引用这样的包含模式:`grep pattern -r --include ="*.{cpp,h}"rootdir`
@topek:好点 - 如果你当前目录中有任何.cpp/.h文件,那么shell会在调用grep之前扩展glob,所以你最终会得到一个命令行,比如`grep pattern -r - -include = foo.cpp --include = bar.h rootdir`,它只搜索名为`foo.cpp`或`bar.h`的文件.如果你没有任何与当前目录中的glob匹配的文件,那么shell会将glob传递给grep,这会正确地解释它.
我刚刚意识到glob只用于匹配文件名.要排除整个目录,需要`--exclude-dir`选项.同样的规则也适用.只匹配目录文件名,而不是路径.
`--include`在`--exclude`之后似乎不起作用.我认为即使尝试也没有意义,除了我有一个`alias` grep,带有一长列`--exclude`和`--exclude-dir`,我用它来搜索代码,忽略库和交换文件和东西.我希望`grep -r --exclude ='*.foo' - include ='*.bar'`可以工作,所以我可以将我的`alias`限制为`--include ='*.bar ''只是,但似乎忽略了`--include`并包含了一些不是.foo文件的内容.交换`--include`和`--exclude`的顺序有效,但是唉,这对我的'别名'没有帮助.

2> rmeador..:

如果您只想跳过二进制文件,我建议您查看-I(大写i)选项.它忽略了二进制文件.我经常使用以下命令:

grep -rI --exclude-dir="\.svn" "pattern" *

它以递归方式搜索,忽略二进制文件,并且不会查看Subversion隐藏文件夹,无论我想要什么样的模式.我在工作箱上把它作为"grepsvn"别名.


`--exclude-dir`无处不在.我的RH框与GNU grep 2.5.1一起工作没有它.
正是我需要的.实际上,我使用git.所以,`--exclude-dir ="\.git"`.:-)

3> Andy Lester..:

请查看ack,它专为这些情况而设计.你的榜样

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

是用ack完成的

ack -icl "foo="

因为默认情况下ack永远不会查找二进制文件,并且默认情况下-r处于启用状态.如果你只想要CPP和H文件,那就做吧

ack -icl --cpp "foo="


好的电话,我不能没有ack.

4> 小智..:

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

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

您还可以设置环境变量:GREP_OPTIONS =" - exclude-dir = .svn"

我将第二个Andy投票给ack,这是最好的.


提及确切版本号的+1; 我有grep 2.5.1和exclude-dir选项不可用

5> Rushabh Meht..:

经过很长一段时间我发现了这个,你可以添加多个包含并排除如下:

grep "z-index" . --include=*.js --exclude=*js/lib/* --exclude=*.min.js


最好将它们组合在一个列表中,如: - exclude = {pattern1,pattern2,pattern3}

6> 小智..:

建议的命令:

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

在概念上是错误的,因为--exclude对基本名称起作用.换句话说,它将仅跳过当前目录中的.svn.


是的,它对我来说根本不起作用.对我有用的是:exclude-dir = .svn
@Nicola谢谢你!我一直在撕扯我的头发为什么这不起作用.告诉我,有没有办法从联机帮助页中发现这个?它说它匹配"PATTERN".*编辑*手册页说"文件",如此处所述http://fixunix.com/unix/89433-why-does-%60grep-exclude%3D-svn%60-not-work.html#post293985

7> 小智..:

在grep 2.5.1中,您必须将此行添加到〜/ .bashrc或〜/ .bash配置文件中

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



8> Aaron Maenpa..:

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

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

虽然,这实际上并没有阻止它搜索二进制文件.


您可以使用`grep -I`跳过二进制文件.

9> OnlineCop..:

如果您不反对使用find,我喜欢它的-prune功能:

find [directory] \
        -name "pattern_to_exclude" -prune \
     -o -name "another_pattern_to_exclude" -prune \
     -o -name "pattern_to_INCLUDE" -print0 \
| xargs -0 -I FILENAME grep -IR "pattern" FILENAME
例如,(当前目录)是有效路径.

在第二和第三线,使用.,"*.png","*.gif",等等.尽可能多地使用这些"*.jpg"结构.

在第4行,你需要另一个-o -name "..." -prune(它指定"或" -o),你想要的模式,你需要一个find-print在它的末尾.如果你只是想"一切"剩下修剪后-print0,*.gif等图像,然后用 *.png和你与4号线实现.

最后,在第5行是管道,-o -print0其中获取每个结果文件并将它们存储在变量中xargs.然后,它传递FILENAMEgrep标志,-IR以及随后"pattern"被扩展FILENAME到成为发现文件名的该列表xargs.

对于您的特定问题,声明可能类似于:

find . \
     -name "*.png" -prune \
     -o -name "*.gif" -prune \
     -o -name "*.svn" -prune \
     -o -print0 | xargs -0 -I FILES grep -IR "foo=" FILES



10> aesede..:

在CentOS 6.6/Grep 2.6.3上,我必须像这样使用它:

grep "term" -Hnir --include \*.php --exclude-dir "*excluded_dir*"

注意缺乏等号"="(否则--include,--exclude,include-dir--exclude-dir被忽略)



11> 小智..:

我是一个dilettante,授予,但这是我的〜/ .bash_profile看起来如何:

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

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

推荐阅读
乐韵答题
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有