我正在寻找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或建议的查找).
使用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="
grep 2.5.3引入了--exclude-dir参数,它将以您想要的方式工作.
grep -rI --exclude-dir=\.svn PATTERN .
您还可以设置环境变量:GREP_OPTIONS =" - exclude-dir = .svn"
我将第二个Andy投票给ack,这是最好的.
经过很长一段时间我发现了这个,你可以添加多个包含并排除如下:
grep "z-index" . --include=*.js --exclude=*js/lib/* --exclude=*.min.js
建议的命令:
grep -Ir --exclude="*\.svn*" "pattern" *
在概念上是错误的,因为--exclude对基本名称起作用.换句话说,它将仅跳过当前目录中的.svn.
在grep 2.5.1中,您必须将此行添加到〜/ .bashrc或〜/ .bash配置文件中
export GREP_OPTIONS="--exclude=\*.svn\*"
我发现grepping grep的输出有时非常有用:
grep -rn "foo=" . | grep -v "Binary file"
虽然,这实际上并没有阻止它搜索二进制文件.
如果您不反对使用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
.然后,它传递FILENAME
的grep
标志,-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
在CentOS 6.6/Grep 2.6.3上,我必须像这样使用它:
grep "term" -Hnir --include \*.php --exclude-dir "*excluded_dir*"
注意缺乏等号"="(否则--include
,--exclude
,include-dir
和--exclude-dir
被忽略)
我是一个dilettante,授予,但这是我的〜/ .bash_profile看起来如何:
export GREP_OPTIONS="-orl --exclude-dir=.svn --exclude-dir=.cache --color=auto" GREP_COLOR='1;32'
请注意,要排除两个目录,我必须使用--exclude-dir两次.