我想 grep for interesting string
,但仅限于特定的文件夹/文件组合,例如myfolder/myfile.out
.
我正在 grep 的目录可能在不同深度的子目录中包含这些组合(否则我可以只是grep 'interesting string' myfolder/myfile.out
),并且我也不想从位于myfile.out
具有不同名称的目录中的任何内容获取结果,例如/deeply/nested/directory/structure/myfolder/myfile.out
应 grep,但不是/deeply/nested/directory/structure/notmyfolder/myfile.out
。
答案1
如果我理解正确的话,你正在寻找类似的东西:
find . -path "*/myfolder/myfile.out" -exec grep <string> /dev/null {} +
答案2
在 zsh 中,**/
全局表示“在任何级别的目录嵌套下”:
grep 'interesting string' **/myfolder/myfile.out
在bash中:shopt -s globstar
然后如上所述。请注意,在 bash ≤4.2 中,这会遍历目录的符号链接。 OSX 上旧版本的 bash 中尚不存在此功能。
在ksh93中:set -G
然后如上所述。
如果文件名的总长度太长,这可能会失败。在这种情况下,您可以回退到将批量find
运行的调用:grep
find -path '*/myfolder/myfile.out' -exec grep -H 'interesting string' {} +
或者如果您不能依赖 GNU 工具:
find -name myfolder -exec sh -c 'grep "$0" /dev/null "$1/myfile.out"' 'interesting string' {} \;
不过如果你有 zsh 那么它会再次拯救你zargs
:
zargs -- **/myfolder/myfile.out -- grep 'interesting string' /dev/null
另一种方法是使用不同的工具,以比 GNU grep 更奇特的方式将 grep 和目录遍历结合起来。例如,您可以使用银色搜索者:
ag -G '/myfolder/myfile\.out$' 'interesting string'