仅在某些文件夹中的文件中使用 Grep

仅在某些文件夹中的文件中使用 Grep

我想 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'

相关内容