为什么管道 find 和 grep 不返回任何内容?

为什么管道 find 和 grep 不返回任何内容?

我试图grep在返回的指定文件中进行搜索find

find . -type d -name 'mydir*' -exec find '{}' -name '*.java' \; | grep 'MyClass'

这是行不通的。

同时,这有效。

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

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

答案1

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

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

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

答案2

因为在第一种情况下,grep它尝试在文件名中查找“MyClass”,而在第二种情况下,它会尝试在文件内容中查找“MyClass”。

第一个等于

find . -type d -name 'mydir*' -exec find '{}' -name '*MyClass*.java' \;

而第二个等于

find . -type d -name 'mydir*' -exec sh -c \
"find '{}' -name '*.java' -exec grep 'MyClass' {} \;" \;

答案3

我认为你的find命令应该是:

find . -type f -path 'mydir*.java'| xargs grep -H 'MyClass'

它查找mydir具有.java扩展名并包含的文件我的课-H指示grep在结果前面输出文件名。

相关内容