我正在使用某个框架,该框架的模块具有一致的文件夹命名约定。我想foo
从高级目录中检索包含部分字符串的所有文件,但我只想要路径包含名为 的目录的文件的结果Bar
。详细说明:从项目的根目录开始,通常有四级子文件夹,包含任意数量的子文件夹和文本文件(全部为 .php)。我想要搜索的子目录/我想要结果的子目录都包含名为 的父文件夹Bar
。
就我有限的经验来说:我想要一个这样的命令,grep -isrl 'foo' ./
并且只接收这样的结果
./A/B/C/Bar/D/F/Some.php
./G/H/I/Bar/Some.php
并排除
./A/B/C/Baz/D/F/Some.php
./G/H/I/Baz/Some.php
本质上,我假设存在类似的grep -isrl 'foo' ./*/Bar/*.php
地方*
将匹配零对多子目录。
答案1
单程:
find <search path> -type d -name 'Bar' -exec grep -r foo {} +
(没有 GNU find,请+
用替换\;
)。
这种方式会首先找到命名的目录Bar
,然后仅在这些目录中递归地进行 grep。
要将搜索限制为 PHP 文件:
find <search path> -type d -name 'Bar' -exec grep -r --include '*.php' foo {} +
它也可以通过 shell 通配符来完成,但这取决于您使用的 shell(显然)。
编辑:添加 Bash 示例:
shopt -s globstar
grep -r test <search path>/**/Bar/