终端命令分解功能

终端命令分解功能

我知道一个我在处理别人的代码库时经常使用的命令,下面是一个例子

find ./ -name "*.php" | xargs grep "my_awesome_function("

我已经阅读了这里每个命令的文档,如 findpipexargsgrephttp://www.computerhope.com/unix.htm

但是我仍然不完全理解这个命令如何从当前目录向下搜索每个 php 文件,然后查找其中哪个文件包含字符串“my_awesome_function(”。我理解管道前部分的工作原理,但管道之后我的理解就消失了。我知道每个文件都像参数一样发送给 grep 命令,有人能解释一下这里发生了什么吗?

答案1

尝试执行find不带最后部分的命令:

find ./ -name "*.php"

您将看到一个文件名列表,所有文件名均以 结尾.php

现在,xarg命令会从管道读取所有这些文件名,取出其中的一组(您可以使用选项设置数量-n 2),然后使用这些名称调用其参数。因此,如果 find 的输出是file1.php file2.php file3.php,并且xarg最多将两个文件组合在一起(或者您使用 强制它这样做xargs -n 2),那么它将调用

grep "my_awesome_function(" file1.php file2.php
grep "my_awesome_function(" file3.php

这反过来会产生输出。您可以通过插入以下内容来查看实际发生的情况echo

find ./ -name "*.php" | xargs echo grep "my_awesome_function("

还可以尝试分组:

find ./ -name "*.php" | xargs -n 2 echo grep "my_awesome_function("

相关内容