find . -name "*.java" -exec grep "foo" {} \;
这仅打印匹配项,没有文件名。
find . -name "*.java" -exec grep "foo" /dev/null {} \;
但这也会打印文件名。
为什么?当 /dev/null 插入到混合中时,find/grep 的哪些机制会导致打印文件名?
PS-是的,我知道我可以做“grep -H”
答案1
如果您既不使用 -h 选项也不使用 -H 选项,那么当有多个文件作为参数时,grep 将写出文件名。因此,如果您将 /dev/null 作为参数添加到 grep,您将始终拥有多个文件,因此文件名将始终被写入。但是,是的,使用 ˛grep -H
是始终写入文件名的最安全方法。
答案2
我猜想grep
,当搜索多个文件时,会在匹配的行前面输出文件名,以区分在哪里找到该行。否则,如果仅指定一个文件,则用户已经知道该行会在哪个文件中找到。
用于grep -h
关闭输出中的文件名,或者grep -H
强制打开它们。