使用grep –exclude / – include语法不通过某些文件grep
我正在寻找目录树中文本文件中的stringfoo=
。 它在一台普通的Linux机器上,我有bash shell:
grep -ircl "foo=" *
在目录中还有许多与“foo =”匹配的二进制文件。 由于这些结果是不相关的,并减缓search,我希望grep跳过search这些文件(主要是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.
searchgrep include , grep include exclude , grep exclude和variants找不到任何相关的东西
如果只有某些文件有更好的方法,我完全可以这么做。 移动违规文件不是一个选项。 我不能只search某些目录(目录结构是一个大混乱,到处都是)。 另外,我不能安装任何东西,所以我必须使用常用工具(如grep或build议的查找 )。
使用shell globbing语法:
grep pattern -r --include=\*.{cpp,h} rootdir
--exclude
的语法是相同的。
请注意,星号是用反斜杠转义的,以防止它被shell扩展(引用它,比如--include="*.{cpp,h}"
)。 否则,如果在当前工作目录中有与该模式匹配的任何文件,命令行将扩展为类似于grep pattern -r --include=foo.cpp --include=bar.h rootdir
,这将只search文件命名为foo.cpp
和bar.h
,这很可能不是你想要的。
如果你只是想跳过二进制文件,我build议你看一下-I
(大写字母i)选项。 它忽略了二进制文件。 我经常使用下面的命令:
grep -rI --exclude-dir="\.svn" "pattern" *
它recursionsearch,忽略二进制文件,并不看Subversion隐藏文件夹,无论我想要的任何模式。 我的工作箱上有“grepsvn”的别名。
请看一看,这是专为这些情况而devise的。 你的例子
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 .
你也可以设置一个环境variables:GREP_OPTIONS =“ – exclude-dir = .svn”
不过,我会把安迪的票投给阿克斯 ,但这是最好的。
我发现这很长一段时间后,你可以添加多个包括和排除像:
grep "z-index" . --include=*.js --exclude=*js/lib/* --exclude=*.min.js
build议的命令:
grep -Ir --exclude="*\.svn*" "pattern" *
在概念上是错误的,因为 – 排除在基名上工作。 换句话说,它只会跳过当前目录中的.svn。
在grep 2.5.1中,您必须将此行添加到〜/ .bashrc或〜/ .bashconfiguration文件中
export GREP_OPTIONS="--exclude=\*.svn\*"
我发现grep grep的输出有时是非常有用的:
grep -rn "foo=" . | grep -v "Binary file"
但是,这实际上并没有阻止它search二进制文件。
在CentOS 6.6 / Grep 2.6.3上,我必须像这样使用它:
grep "term" -Hnir --include \*.php --exclude-dir "*excluded_dir*"
注意缺less等号“=”(否则--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两次。
如果你不反对使用find
,我喜欢它的-prune
特性:
find[目录] \ -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
在第一行中,指定要search的目录。 .
(当前目录)是一个有效的path,例如。
在第二行和第三行,使用"*.png"
, "*.gif"
, "*.jpg"
等等。 像使用模式一样,使用许多这样的-o -name "..." -prune
结构。
在第四行,你需要另一个-o
(它指定“或” find
),你想要的模式,你需要一个-print
或-print0
在它的末尾。 如果你只是在修剪*.gif
, *.png
等图像之后需要“其他所有东西”,那么就使用-o -print0
,然后完成第四行。
最后,第五行是xargs
的pipe道,它将每个结果文件存储在一个variablesFILENAME
。 然后它传递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
试试这个:
$ find。 -name“* .txt”-type f -print | xargs文件| grep“foo =”| 切-d:-f1
在此build立: http : //www.unix.com/shell-programming-scripting/42573-search-files-excluding-binary-files.html
find和xargs是你的朋友。 使用它们来过滤文件列表,而不是grep的–exclude
尝试类似
find . -not -name '*.png' -o -type f -print | xargs grep -icl "foo="
这些脚本不能完成所有的问题…试试这个更好:
du -ha | grep -i -o "\./.*" | grep -v "\.svn\|another_file\|another_folder" | xargs grep -i -n "$1"
这个脚本更好,因为它使用“真正的”正则expression式来避免search目录。 只需将文件夹或文件名与“\ |”分开 在grep -v上
好好享受! 在我的linuxshell上find! XD
看@这个。
grep --exclude="*\.svn*" -rn "foo=" * | grep -v Binary | grep -v tags
--binary-files=without-match
选项让GNU grep
可以跳过二进制文件。 (相当于其他地方提到的-I
开关。)
(这可能需要最新版本的grep
;至less2.5.3版本。)
适用于tcsh .alias文件:
alias gisrc 'grep -I -r -i --exclude="*\.svn*" --include="*\."{mm,m,h,cc,c} \!* *'
花了我一段时间才发现{mm,m,h,cc,c}部分不应该放在引号内。 〜基思
如果您非recursionsearch,则可以使用glop模式来匹配文件名。
grep "foo" *.{html,txt}
包括html和txt。 它仅在当前目录中进行search。
要在子目录中search:
grep "foo" */*.{html,txt}
在子目录中:
grep "foo" */*/*.{html,txt}
忽略来自grep的所有二进制结果
grep -Ri "pattern" * | awk '{if($1 != "Binary") print $0}'
awk部分将过滤掉所有的二进制文件foo匹配行
尝试这个:
- 在currdir下创build一个名为“
--F
”的文件夹(或者将另一个文件夹重命名为“--F
”,即double-minus-F
。 -
#> grep -i --exclude-dir="\-\-F" "pattern" *