使用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" *