自动忽略grep中的文件

时间:2009-12-12 04:29:54

标签: grep bash

在搜索某些内容时,有什么方法可以使用grep来忽略某些文件,相当于svnignore或gitignore?在搜索源代码时,我通常会使用类似的东西。

grep -r something * | grep -v ignore_file1 | grep -v ignore_file2

即使我可以设置grep的别名来忽略这些文件也不错。

6 个答案:

答案 0 :(得分:9)

grep上的

--exclude选项也可以起作用:

grep  perl * --exclude=try* --exclude=tk*

这会在当前目录中的文件中搜索perl,不包括以trytk开头的文件。

答案 1 :(得分:2)

您可能还想查看ack,在许多其他功能中,默认情况下不会搜索.svn和.git等VCS目录。

答案 2 :(得分:1)

find . -path ./ignore -prune -o -exec grep -r something {} \;

这样做是找到当前目录中除名为“ignore”的目录(或文件)之外的所有文件,然后对非忽略文件中的每个文件执行命令grep -r something。

答案 3 :(得分:1)

使用shell扩展

shopt -s extglob
for file in !(file1_ignore|file2_ignore) 
do
  grep ..... "$file"
done

答案 4 :(得分:0)

我认为grep没有文件名过滤功能。 要完成您要执行的操作,可以组合find,xargs和grep命令。 我的记忆力不好,所以这个例子可能不起作用:

find -name "foo" | xargs grep "pattern"

查找非常灵活,您可以使用通配符,忽略大小写或使用正则表达式。 您可能需要阅读手册页以获得完整描述。

阅读下一篇文章后,显然grep确实有文件名过滤。

答案 5 :(得分:0)

这是.gitignore的简约版本。需要标准工具:awk,sed(因为我的awk非常蹩脚),egrep:

cat > ~/bin/grepignore  #or anywhere you like in your $PATH
egrep -v "`awk '1' ORS=\| .grepignore | sed -e 's/|$//g' ; echo`"
^D
chmod 755 ~/bin/grepignore
cat >> ./.grepignore  #above set to look in cwd
ignorefile_1
...
^D
grep -r something * | grepignore

grepignore构建了一个简单的替换子句:

egrep -v ignorefile_one|ignorefile_two

效率不高,但适合手动使用