当前位置: 首页 > 科技观察

下面说说Linux下的Xargs命令,你知道吗?

时间:2023-03-12 01:36:32 科技观察

xargs是一个经常被大家忽略的命令。很多人可能不熟悉它的一些用法。事实上,它是一个强大的命令,尤其是在批处理结合流水线方面。xargs的语法如下:xargs[OPTION]...COMMAND功能xargs最重要的功能是使用空格或换行符作为分隔符,将标准输入转换为多个命令行参数。与管道命令结合使用时,可以体现xargs的功能。下面举例说明[root@ecs-centos-7tmp]#echo"112233"|xargsmkdir[root@ecs-centos-7tmp]#lltotalusage16drwxr-xr-x2rootroot4096January2000:0311drwxr-xr-x2rootroot4096January2000:0322drwxr-xr-x2rootroot4096January2000:0333在上面的例子中,管道左侧命令echo"112233"的输出被用作管道右侧命令xargsmkdir的输入,并且管道右侧的命令将左侧的输入分成多条带有空格或换行分隔符的命令行的参数,所以echo"112233"|xargsmkdir命令等价于以下三个命令mkdir11mkdir22mkdir33选项说明选项说明-d指定输入参数的分隔符,默认为空格或换行符作为分隔符-p打印出要执行的命令,并询问user是否执行-t打印出最后执行的命令,不需用户确认执行一项命令行参数的替换字符串,类似于存储参数项的中间变量-r当输入不包含任何非空格时,不执行命令示例1xargs不带任何选项xargs命令主要用于管道,但它也可以单独使用。这时候xargs就相当于echo命令,用户的输入通过echo命令输出到屏幕[root@ecs-centos-7~]#xargshelloworld!(ctrl+d)helloworld![root@ecs-centos-7~]#上例中,输入xargs回车后,开始接受用户输入。用户输入helloworld!后,按ctrl+d结束输入。结束后,用户输入的内容会输出到屏幕上例2-d选项-d选项可以指定xargs命令的分隔符[root@ecs-centos-7~]#echo-n"a#b#c"|xargsechoa#b#c[root@ecs-centos-7~]#echo-n"a#b#c"|xargs-d"#"echoabc在上面的例子中,指定的分隔符是#,所以"a#b#c"转换为abc的三个命令行参数例3-p选项-p选项会打印出要执行的命令,并在执行命令前进行二次确认,y表示确认执行,n表示取消执行[root@ecs-centos-7tmp]#echo"abc"|xargs-ptouchtouchabc?...y[root@ecs-centos-7tmp]#lltotalusage0-rw-r--r--1rootroot0January2000:46a-rw-r--r--1rootroot0January2000:46b-rw-r--r--1rootroot01month2000:46c例4-t选项-t选项打印出最后执行的命令,直接执行命令,无需用户确认两次[root@ecs-centos-7tmp]#lltotalusage0-rw-r--r--1rootroot0January2000:49a-rw-r--r--1rootroot02000年1月:49b-rw-r--r--1rootroot01月2000:49c[root@ecs-centos-7tmp]#echo"abc"|xargs-trmrmabc示例5-0option我们前面提到xargs命令之间用空格或者换行符分隔,大多数情况下执行是正常的,但是有一种情况会出现问题,就是当文件名包含空格时,当将包含空格的文件名作为输入传递给xargs时,会被xargs作为多个命令行参数进行处理。该示例重现了问题[tt@ecs-centos-7tmp]$lsa.txtb1.txtc.txt[tt@ecs-centos-7tmp]$ls|xargs-trmrma.txtb1.txtc.txtrm:cannotdelete'b':Nosuchfileordirectoryrm:Unabletodelete"1.txt":Nosuchfileordirectory[tt@ecs-centos-7tmp]$例子中通过ls命令我们知道有a.txtb1目录中的.txtc。txt三个文件当使用ls|xargs-trm命令删除目录下所有文件,发现a.txt和c.txt可以正确删除,但是b1.txt文件名包含空格,删除有时会被当成两个文件b和1.txt。因此,在例子的输出中,rm:cannotdelete"b":nosuchfileordirectory和rm:cannotdelete"1.txt":nosuch以上问题可以结合-0选项和find来解决命令[tt@ecs-centos-7tmp]$lsa.txtb1.txtc.txt[tt@ecs-centos-7tmp]$find.-typef-print0|xargs-0-trmrm./a.txt./b1.txt./c.txt[tt@ecs-centos-7tmp]$lltotalusage0[tt@ecs-centos-7tmp]$find命令-print0选项表示输出文件列表用null分隔。同时xargs命令的-0选项表示使用null作为分隔符。从输出结果可以看出-0选项结合find命令可以正确删除包含空格的文件名。示例6-n选项有时用户会输入多个参数,-n选项将有多少参数作为命令行参数[tt@ecs-centos-7tmp]$echo"abcdef"|xargs-n2abcdef[tt@ecs-centos-7tmp]$echo"abcdef"|xargs-n4abcdef[tt@ecs-centos-7tmp]$命令回显“abcdef”|xargs-n2指定每2个参数作为一个命令的输出,所以abcdef6个参数输出3行。同样,命令echo"abcdef"|xargs-n4指定每4个参数作为一次输出,所以abcdef6个参数输出2行,第二行只有两个参数实例7-roption该选项表示当输入不包含非空格时,命令将不会被执行。默认情况下,无论输入是否包含非空格,命令都会被执行。有些命令必须有操作数。如果输入不包含任何参数,执行这些命令时会出现缺少操作数的错误信息。可以加上-r选项就不会出现报错信息[tt@ecs-centos-7tmp]$echo''|xargsrmrm:missingoperandTry'rm--help'formoreinformation.[tt@ecs-centos-7tmp]$echo''|xargs-rrm[tt@ecs-centos-7tmp]$在上面的示例中,命令echo''的结果作为输入传递到管道右侧的xargsrm。参数转换后,xargsrm没有任何参数,所以执行rm命令时会提示缺少操作数,但是xargs-rrm命令不会执行,所以不会有错误提示例8-I参数-I参数表示命令行参数[tt@ecs-centos-7tmp]$lsabc[tt@ecs-centos-7tmp]$ls|sort|xargs-IFsh-c'各个参数的变量echoF.txt;touchF.txt'a.txtb.txtc.txt[tt@ecs-centos-7tmp]$lsaa.txtbb.txtcc.txt在上面的例子中,当前目录下有三个文件abc命令ls|排序|xargs-IFsh-c'echoF.txt;触摸F.txt'的输入分别是a,b,c,-IF表示F是输入参数的替换字符串。执行命令时,后面命令中的FechoF.txt;touchF.txt将被替换为实参,实际执行的命令如下:echoa.txt;toucha.txttechob.txt;touchb.txttechoc.txt;touchc.txt总结本文介绍了xargs命令的常用用法,并举例说明常用选项。有关xargs命令的更多信息请参阅命令文档以了解用法