作为Kentnotes,你不能用一个直的grep来做这个;它根本不够强大。诀窍是使用find 确定要搜索的文件,并将find 生成的文件列表传递给grep。
如果您运行man find,您将获得find 采用的许多 选项的手册页。我们在这里感兴趣的是-maxdepth。
让我们构建我们需要的命令。在每个阶段运行命令以查看它的样子:
find . 将列出当前文件夹 (.) 或任何后代文件夹中存在的所有文件和文件夹。
find . -maxdepth 1 将列出当前文件夹中的所有文件和文件夹。 find . -maxdepth 2 同样会列出当前文件夹和任何直接子文件夹中的所有文件和文件夹。等等……
请注意,我们也会列出文件夹;我们不希望这样,因为grep 不能搜索文件夹本身,只能搜索文件夹中的文件。添加-type f 以仅获取列出的文件:find . -maxdepth 2 -type f。
现在我们知道了要搜索的文件,我们需要获取grep 来搜索这些文件。执行此操作的标准方法是使用 xargs:
find . -maxdepth 2 -type f | xargs grep <text-to-search-for>
| 从find(即您通常在屏幕上看到的内容)获取“标准输出”,也就是“stdout”,并将其通过管道传输到xarg 的“标准输入”,也就是“stdin”,即,如果您正在输入正在运行的程序,通常会发生什么。
xargs 是一个狡猾的小程序,在添加它在标准输入上收到的所有参数后,它会运行你告诉它的任何东西(这里是grep <text-to-search-for>)。结果是grep 将搜索find 找到的每个文件。
但是,如果您的某些文件名中有空格,这将不起作用,因为xargs 认为空格分隔两个不同的文件名,而不是一个文件名的一部分。有很多方法可以解决这个问题(理想的方法是不要在文件名中使用空格),最常见的方法是使用 find 的一个更高级的功能。
如果您将-exec 参数添加到find,它将执行您指定的所有内容,直到; 或+。如果您添加 {}(即文字字符 { 和 }),它将用所有文件的列表替换它。由于find 正在这样做,它知道文件名中的空格应该在文件名中。
因此,做你想做的事情的最好方法是:
find . -type f -maxdepth 2 -exec grep <text-to-search-for> {} +
(+ 和; 结尾的区别在这里没有区别。如果你有兴趣,可以在man find,但简短的版本是+ 更快,但意味着你只能有一个{} 在命令中。)