【发布时间】: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.xml、file7.xml、file8.xml
To exclude.git和.svn,我想出了:
grep -r --exclude-dir={.git,.svn} --include=\*.xml "pattern"
仍会搜索 file3.xml 到 file8.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"
【问题讨论】: