两个查找命令比较

VVe*_*lev 12 shell bash find

最近我收到了这个findone-liner,但我无法解释以下两者的区别从何而来:

示例 1

[root@centos share]# find . -exec grep -i "madis" {} /dev/null \;

./names:Madison Randy:300:Product Development
Run Code Online (Sandbox Code Playgroud)

示例 2

[root@centos share]# find . -exec grep -i "madis" {} \;

Madison Randy:300:Product Development
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,在第一个中有这个字符串派生自的特定文件,到目前为止我真的无法找出为什么会发生这种情况。

spu*_*der 17

您告诉 grep 搜索 2 个位置。如果搜索多个位置,grep 仅显示完整位置。

例如

touch /tmp/herp /tmp/derp
cd /tmp
echo "foo" > herp
echo "foo" > derp
Run Code Online (Sandbox Code Playgroud)

请注意,如果我只搜索 1 个文件,grep 会忽略文件名

grep -i "foo" /tmp/herp
foo
Run Code Online (Sandbox Code Playgroud)

但是如果我指定多个搜索位置,grep 会说它在哪里找到每个匹配项

grep -i "foo" herp derp
/tmp/derp:foo
/tmp/herp:foo
Run Code Online (Sandbox Code Playgroud)

/dev/null通过提供 2 个参数,添加它是否会欺骗 grep 打印出完整路径。


Hau*_*ing 5

man grep

-H, --with-filename

打印每个匹配项的文件名。这是要搜索多个文件时的默认设置。

在两种情况下使用一两个文件参数调用 grep 会导致差异。/dev/null您可以grep使用参数调用而不是添加-H。也许这种/dev/null行为得到了更广泛的支持。

  • `grep -H` 不可移植——`/dev/null` 技巧在没有 GNU grep 的情况下也能工作。 (3认同)