linuxxargs命令详解linux args命令参数设置




linuxxargs命令详解linux args命令参数设置

2022-07-21 2:24:14 网络知识 官方管理员

linuxxargs命令详解(linuxargs命令参数设置)(1)

xargs常常被大家忽略的一个命令,对它的一些用法很多人可能不熟悉,其实它是一个功能强大的命令,特别是在结合管道进行批量处理方面

语法

xargs语法格式如下

xargs[OPTION]...COMMAND

作用

xargs最重要的作用是以空格或者换行作为分隔符,把标准输入转化成多个命令行参数,在与管道命令结合使用时,就能体现出xargs的作用

下面以实例来说明

[root@ecs-centos-7tmp]#echo"112233"|xargsmkdir[root@ecs-centos-7tmp]#ll总用量16drwxr-xr-x2rootroot40961月2000:0311drwxr-xr-x2rootroot40961月2000:0322drwxr-xr-x2rootroot40961月2000:0333

上面的例子中,管道左侧的命令echo"112233"的输出作为管道右侧命令xargsmkdir的输入,管道右侧的命令将左侧的输入以空格或者换行为分隔符分成多个命令行的参数

所以echo"112233"|xargsmkdir命令等同于下面的三条命令

mkdir11mkdir22mkdir33

选项说明

选项

说明

-d

指定输入参数的分隔符,默认是以空格或换行作为分隔符

-p

打印出将要执行的命令,并询问用户是否要执行

-t

打印出最终执行的命令并执行,不需要用户确认

-0

表示用null作为分隔符

-n

每次将一行中的多少项参数作为命令行参数

-I

指定每一项命令行参数的替代字符串,类似一个存储参数项的中间变量

-r

当输入不包括任何非空格时,不执行命令

实例1不带任何选项的xargs

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]#ll总用量0-rw-r--r--1rootroot01月2000:46a-rw-r--r--1rootroot01月2000:46b-rw-r--r--1rootroot01月2000:46c

实例4-t选项

-t选项打印出最终执行的命令,并且直接执行命令,不再需要用户二次确认

[root@ecs-centos-7tmp]#ll总用量0-rw-r--r--1rootroot01月2000:49a-rw-r--r--1rootroot01月2000:49b-rw-r--r--1rootroot01月2000:49c[root@ecs-centos-7tmp]#echo"abc"|xargs-trmrmabc

实例5-0选项

前面我们讲过xargs命令是以空格或换行为分隔符的,大部分情况下执行都是正常的,但是有一种情况下会出现问题,那就是当文件名中包含空格的时候

含有空格的文件名当作输入传给xargs的时候,会被xargs当作多个命令行参数来处理

下面的例子重现了问题

[tt@ecs-centos-7tmp]$lsa.txtb1.txtc.txt[tt@ecs-centos-7tmp]$ls|xargs-trmrma.txtb1.txtc.txtrm:无法删除"b":没有那个文件或目录rm:无法删除"1.txt":没有那个文件或目录[tt@ecs-centos-7tmp]$

例子中,通过ls命令知道目录下有a.txtb1.txtc.txt三个文件

当通过ls|xargs-trm命令来删除目录下所有文件的时候发现,a.txt和c.txt都能被正确的删除,但是b1.txt文件名中包含空格,删除的时候会被当作b和1.txt两个文件处理

所以,例子中输出结果中才会出现rm:无法删除"b":没有那个文件或目录和rm:无法删除"1.txt":没有那个文件或目录的错误提示

上述的问题可以通过-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]$ll总用量0[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]$

命令echo"abcdef"|xargs-n2指定每2个参数作为一次命令的输出,所以abcdef6个参数输出了3行

同样的,命令echo"abcdef"|xargs-n4指定每4个参数作为一次输出,所以abcdef6个参数输出2行,而且第2行只有两个参数

实例7-r选项

此选项表示,当输入不包含非空格时,不执行命令,默认情况下,不管输入是否包含非空格时,都会执行命令

有些命令必须要有操作数,如果输入不包含任何参数时,执行这些命令会有缺少操作数的错误提示,可以加上-r选项就不会出现错误提示了

[root@ecs-centos-7tmp]#echo"112233"|xargsmkdir[root@ecs-centos-7tmp]#ll总用量16drwxr-xr-x2rootroot40961月2000:0311drwxr-xr-x2rootroot40961月2000:0322drwxr-xr-x2rootroot40961月2000:03330

上面的例子中,命令echo''的结果作为输入传给管道右边的xargsrm,经过参数转化,xargsrm没有任何参数,所以执行rm命令时会提示缺少操作数,但是xargs-rrm命令是不会执行的,所以它不会有错误提示

实例8-I参数

-I参数表示命令行参数的每一项参数的变量

[root@ecs-centos-7tmp]#echo"112233"|xargsmkdir[root@ecs-centos-7tmp]#ll总用量16drwxr-xr-x2rootroot40961月2000:0311drwxr-xr-x2rootroot40961月2000:0322drwxr-xr-x2rootroot40961月2000:03331

上面例子中,当前目录有abc三个文件

命令ls|sort|xargs-IFsh-c'echoF.txt;touchF.txt'的输入分别是a、b、c,-IF表示F是输入参数的替代字符串,执行命令的时候,后面命令echoF.txt;touchF.txt中的F会被实际的参数替换掉,实际会执行下面几条命令

[root@ecs-centos-7tmp]#echo"112233"|xargsmkdir[root@ecs-centos-7tmp]#ll总用量16drwxr-xr-x2rootroot40961月2000:0311drwxr-xr-x2rootroot40961月2000:0322drwxr-xr-x2rootroot40961月2000:03332

小结

本文介绍了xargs命令的常见用法,常用的选项都有实例说明,更多关于xargs命令的用法请查阅命令文档

发表评论:

最近发表
网站分类
标签列表