我试图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
在结果前面输出文件名。