如何确定使用 grep、find 和 xargs 的不同命令是否执行相同的操作?

如何确定使用 grep、find 和 xargs 的不同命令是否执行相同的操作?

这三个命令的作用相同吗?

  • 使用 grep 的命令。

    grep "a" -r .
    
  • 使用 find 的命令。

    find .  -exec grep "a" {} \;
    
  • 通过 xargs 在 find 上使用 grep 的命令。

    find . | xargs grep "a"
    

答案1

它们并不相同,并且各自都有问题。

  • 第一个是不可移植的,因为它使用了 Gnu 扩展。此外,选项应位于模式之前,而不是模式之后。
  • 第二个没有显示文件名,正如已经提到的。
  • 如果文件名中有嵌入空格或类似内容,第三个方法将会失败。

我会改用:

find .  -type f -exec grep a /dev/null {} +

它是可移植的,它会忽略非常规文件,它不会与奇怪的文件名发生冲突,并且在找到模式时始终显示文件名。

答案2

这是一道家庭作业题吗?

你试过了吗?

他们做的事情略有不同。

例如,如果您输入grep单个文件名,它不会在输出中回显该文件名。使用grepwith时,这可能会令人沮丧find

答案3

您最好定义“做同样的事情”。第一个运行一个命令,第二个对找到的每个文件运行一次 find 和 fork+exec 的 grep,第三个运行至少三个命令 - 如果找到的文件太多而无法放在一个命令行中,则运行更多命令。就 CPU/内存影响而言,它们最明显不是做同样的事情——1、3 和“一大堆”流程之间的差异是显著的。

从文件系统的角度来看,文件系统被遍历,每个文件都被统计,然后打开、完全读取并关闭。因此从这个角度来看,它们都做同样的事情,文件系统没有注意到差异(除了第二个实例中的遍历速度可能较慢,因为分叉了无数个进程的开销)。

屏幕上生成的输出有所不同,并且可以通过仅运行具有几个不同的可能目录结构的命令来凭经验确定该差异(一种明显的方法是 redgrittybrick 提到的)。

由于字符数量不同以及语法错误的可能性,它们所需的打字时间也不同。

等等。事情有很多种“不同”的方式。:)

相关内容