xargs
搜索当前目录中的C文件,查找main关键字。
find . -name "*.c" | xargs grep main
需要区分开xargs和单纯使用管道的区别,单独使用管道|,是把上一个命令的标准输出作为后一个命令的标准输入;而使用xargs则会把上一个命令的标准输出作为后一个命令的标准命令。
比如上面的命令如果不加xargs来传参,那么搜索的含义将发生变化:
find . -name "*.c" | grep main
这条命令表示的是搜索当前目录中的所有c文件,并且查找文件名中包含有main关键字的文件
默认情况下,xargs会把前面命令的输出全部作为后一条命令的参数执行一次。如果说我们想要把第一条命令的输出依次传递给后条命令并执行多次,那么需要使用如下方式,比如:
ls | xargs -I {} echo test {}
该命令会输出如下:
test bin
test boot
test data
test dev
test etc
test home
test lib
test lib64
而如果不加-I选项,结果如下:
test bin boot data dev etc home lib lib64
find -exec命令
find . -name "*.c" -exec grep main -H {} \;
和xargs一样,find的-exec命令也可以实现指定文件的命令参数传递,执行时的{}将会被替换为find的搜索结果。它和xargs的区别在于xargs会把find的结果以空格为间隔的方式传递到命令中。而find -exec以{} \
结尾,则会把find的每行结果作为后面的命令参数执行一次。
如果find -exec后面是以{} +
结尾,那么此时的执行方式是与xargs的默认行为是一致了。