我知道一个我在处理别人的代码库时经常使用的命令,下面是一个例子
find ./ -name "*.php" | xargs grep "my_awesome_function("
我已经阅读了这里每个命令的文档,如
find
、pipe
和xargs
grep
http://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("