【问题标题】:Recursive grep within specific subdirectories特定子目录中的递归 grep
【发布时间】:2018-05-17 18:22:07
【问题描述】:

我希望 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

我只想对以下文件进行 grep: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"

【问题讨论】:

    标签: bash grep


    【解决方案1】:

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

    search() {
        local dir=$1
        local pattern=$2
        local args=("${@:3}")
    
        find "$dir" -type d \( -name .git -o -name .svn \) -prune -o \
            -path '*/bar/*.xml' -exec grep "${args[@]}" "$pattern" {} +
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-19
      相关资源
      最近更新 更多