为什么管道 find 和 grep 什么都不返回?

5 grep pipe find

我正在尝试在grep由以下返回的指定文件中进行搜索find

find . -type d -name 'mydir*' -exec find '{}' -name '*.java' \; | grep 'MyClass'
Run Code Online (Sandbox Code Playgroud)

这不起作用。

同时,这有效。

grep 'MyClass' $(find . -type d -name 'mydir*' -exec find '{}' -name '*.java' \;)
Run Code Online (Sandbox Code Playgroud)

我的第一个例子有什么问题?

Jar*_*nen 6

在第一种情况下,您 grep 返回find的文件名列表,而在第二种情况下,文件名列表是 grep 的参数,因此 grep 将在文件内搜索。

管道是标准输入,而不是命名文件。这就是 grep 行为不同的原因。
来自man grep

grep 搜索命名输入文件(或标准输入,如果没有命名文件,或者如果给定单个连字符减号 (-) 作为文件名)中包含与给定 PATTERN 匹配的行。