啥时候用xargs
主要讲述以下两个shell指令区别,通过这个例子来理解xargs与管道
1 不加xargs的管道
管道都是前面的输出作为后面的输入,而不加xargs这种正常的管道,讲的具体一点是:
前面的输出变成一个匿名文件,后面的shell接这个匿名文件
我们详细展开第一句的效果等同于下面的shell,这样作用就很明显了,就是先找到当前目录下test开头的文件列表,然后呢这些文件名里面含有js字样的给过滤出来
因为我当前目录有多个testx.js文件,所以上述指令结果如下
2 加xargs的管道
同样还是前面的输出作为后面的输入,只不过这次没有中间文件了,
前面shell的字符串输出,通过空格和回车拆分成1或多条,后面shell接这一或多条
我们将第二局shell展开,就等效于下面指令,即找到所有test开头的文件,并在文件内容里寻找js字样,注意不加xargs是在文件名里寻找。可以通过xargs后面加-t查看实际执行的shell。
这几个js文件的内容中基本也都含有js字样,指令结果如下。

3 xargs补充
3.1 -0 与 -d (这是零,不是O)
默认是空格或回车为分割,但是文本中可能原来就有空格,经常会有不想用空格做分割的情况,或者文本中本来有回车符,但是只想用多行shell输出的回车符号。那么可以在前一个shell最后添加 -print0 表示用 \0 这个字符来分割shell输出的每一行,后一个shell用xargs -0即可避免文本中本来的空格或回车引起的多分了行。
也可以使用-d自己指定分隔符,例如只指定回符号如下
3.2 -L 与 -I (大L与大i)
前面我们发现虽然有多行,但是第二句shell还是把多行隔开后,拼成了一句grep语句了,如果想每一行分别作为一句shell去运行,则可以用-L 1参数,1就是前面结果列表中一个元素过来拼成一个新的shell。
此时等价于
此外有时候我们的管道过来的字符串并不一定是放到shell最后,可能是前面,那强大的-I就提供了这个功能,下面占位符可以换成任意字符,常用{}罢了,也可以换成xxx等。
-I作用后,shell就只能被拆分了,所以也有-L 1的效果,等效于如下