特定子目录中的递归grep

时间:2018-05-17 18:22:08

标签: bash grep

我希望grep只存在于特定子目录下的某些文件。在这里,我只想要 .xml 文件,如果它们存在于/bar/子目录下面:

./file0.xml
./.git/file1a.xml
./.git/bar/file1b.xml
./.svn/file2a.xml
./.svn/foo/bar/baz/file2b.xml
./path1/file3.xml
./path1/foo/file4.xml
./path2/foo/bar/file5.xml
./path2/foo/baz/file6.xml
./path3/bar/file7.xml
./path3/foo/bar/baz/file8.xml

我只想要抓取以下文件:file5.xmlfile7.xmlfile8.xml

To exclude .git.svn,我想出了:

grep -r --exclude-dir={.git,.svn} --include=\*.xml "pattern"

仍在搜索file3.xmlfile8.xml

如果我grep -v不受欢迎的目录:

grep -r --exclude-dir={.git,.svn} --include=\*.xml "pattern" | grep -v /bar/

我得到了预期的结果,但它花费了大量时间来解析非/bar/文件。

使用find查找/res/下的xml文件,我得到了所需的结果(并且比上面的结果快得多):

find . -type d \( -name .git -o -name .svn \) -prune -o \
       -path '*/bar/*.xml' -exec grep "pattern" {} +

我试图避免这种情况,因为我在脚本中使用它并且不希望仅限于在顶级./目录中启动搜索。

有没有办法只使用grep来实现这一点(因此它不会阻止用户指定其他grep选项和/或启动搜索目录)?也许是这样的事情:

grep -r --exclude-dir={.git,.svn} --include=\*/bar/\*.xml "pattern"

1 个答案:

答案 0 :(得分:0)

find + grep绝对是一个很好的方法。您可以通过定义在战略位置插入参数的函数来使其更灵活。例如:

{{1}}