前些天在帮助朋友的服务器上修改了一些脚本,而后来他问我在脚本中xargs是什么,因此在这里就简单的说一说xargs。

   在实际生产环境中,往往只用一种指令去处理数据,一般都是不够的,那要使我们能更为高效的处理数据就要使用到管道(|),利用管道把几种指令拼接起来,以用来更好、更高效的处理数据,而管道的实现方式是把上一个指令的stdout的数据放到下一个指令的stdin的数据中,但是在系统中有一些指令,如:rm、ls、cp、mv等等这些指令是不会接收来自stdin的数据,那我们就无法把rm、ls、cp、mv等等这些指令使用管道连接起来,那么如果要使用就要用到xargs。xargs的默认命令是echo,空格是默认定界符。这意味着通过管道传递给xargs的输入将会包含换行和空白,不过通过xargs的处理,换行和空白将被空格取代。当然还有具体的参数选项可以查看man帮助文档,在这里就简单的举一个例子:

[root@localhost ~]# ls |xargs rm -rf
#通过管道和xargs把ls和rm非管道指令拼接起来,意思是删除当前目录下的所有文件,要注意的是这条指令一定不能再/下执行

[root@localhost test]# ls
test2  test.bz2
[root@localhost test]# 
[root@localhost test]# find /data/test/ -type f -name "*.bz2" -print
/data/test/test2/test.bz2
/data/test/test.bz2
[root@localhost test]# find /data/test/ -type f -name "*.bz2" -print |xargs rm -rvf
已删除“/data/test/test2/test.bz2”
已删除“/data/test/test.bz2”
#这样通过xargs把find出的结果传递给rm,当然find本身也是有exec的参数选项的,所以以上也可以写成:
[root@localhost test]# find /data/test/ -type f -name "*.bz2" -exec rm -rvf {} \;
已删除“/data/test/test2/test.bz2”
已删除“/data/test/test.bz2”

   当然很多非管道指令可以通过xargs接收来自stdin的数据的指令还有很多,在次就不一一列举了,总之xargs往往都是伴随着管道使用的重要指令。