关键词:
Xargs的使用
发现xargs是个很好用的命令,于是搜索了网上好多关于xargs的文章并做了相关的实验,现自己总结一下,好转化为自己的东西:
Xargs经常会与管道搞混淆,所以
首先我们先了解下管道的作用:
? 管道实现的是:将前面的stdout作为后面的stdin进行传递。但有些命令是不接受管道的传递方式,比如:ls (#echo ‘/root’| ls )
? 管道传递过来的stdin只能作为内容而不是参数。或者说是管道无法正确传递到后面命令的参数位:(#echo ‘--help’| cat ,区别于#echo ‘--help’| xargs cat )
鉴于管道功能上的局限,所以xargs的作用就显现出来了:
? Xargs实现的是将管道传输过来的stdin进行处理后,传递到命令的参数上。即xargs完成了两个动作:A.处理管道传输过来的stdin B.将处理后的stdin传递到正确的位置上
④ Xargs的作用不仅仅限于简单的stdin传递到命令的参数位。它还可以将stdin或者文件stdin分割成批,每个批中有很多分割片段,然后将这些片段按批交给xargs后面的命令进行处理。
⑤ Xargs默认其后面的命令是echo(“echo ‘a.txt’| xargs ”= ”echo ‘a.txt’| xargs echo“)而空格是其默认的定界符。
⑥ Xargs会把管道传递过来的stdin里的换行符,空白换成空格取代,形成一行作为整体输出:
[[email protected] tmp]# cat c.txt
a.txt
b.txt
[[email protected] tmp]# cat c.txt | xargs
a.txt b.txt
即:如果不指定分批选项(-i,-L,-n),Xargs的一整行结果将作为一个整体输出,而不是分隔开的!
⑦ Xargs一些比较常用的选项:
分割选项:-d ,-0 | 分批选项: -n,-L,-i/-I | 使用-p或-t来观察命令的执行过程
分割选项 -d, -0:分割前会对stdin分批做一个分行动作,然后才进行分割
-d 指定分隔符
[[email protected] testfile]# cat list.txt
a1.bak,a2.bak,a3.bak,a4.bak
[[email protected] testfile]# cat list.txt | xargs -d','
a1.bak a2.bak a3.bak a4.bak
<——分割后输出会多出分行符,会对后续的命令有影响
[[email protected] testfile]# cat list.txt | xargs -d',' cat
this is a1
this is a2
this is a2.
this is a3
this is a3.
this is a3..
cat: a4.bak
: 没有那个文件或目录<——这里就因为分割输出多出的那一空行导致a4.bak文件无法读出
[[email protected] testfile]#
正确的命令应该为:cat list.txt | xargs -d',' |xargs cat
-0 指定固定的 作为分隔符。
其实xargs -0就是特殊的xargs -d的一种,它等价于xargs -d"