使用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 includegrep include excludegrep 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.cppbar.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 ,– --excludeinclude-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" ,然后FILENAMExargs扩展成为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匹配行

尝试这个:

  1. 在currdir下创build一个名为“ --F ”的文件夹(或者将另一个文件夹重命名为“ --F ”,即double-minus-F
  2. #> grep -i --exclude-dir="\-\-F" "pattern" *