Linux 下 xargs 命令

Linux 下 xargs 命令

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

语法

xargs 语法格式如下

xargs [OPTION]... COMMAND 作用

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

下面以实例来说明

[root@ecs-centos-7 tmp]# echo "11 22 33" | xargs mkdir [root@ecs-centos-7 tmp]# ll 总用量 16 drwxr-xr-x 2 root root 4096 1月 20 00:03 11 drwxr-xr-x 2 root root 4096 1月 20 00:03 22 drwxr-xr-x 2 root root 4096 1月 20 00:03 33

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

所以 echo "11 22 33" | xargs mkdir 命令等同于下面的三条命令

mkdir 11 mkdir 22 mkdir 33 选项说明 选项 说明
-d   指定输入参数的分隔符,默认是以空格或换行作为分隔符  
-p   打印出将要执行的命令,并询问用户是否要执行  
-t   打印出最终执行的命令并执行,不需要用户确认  
-0   表示用 null 作为分隔符  
-n   每次将一行中的多少项参数作为命令行参数  
-I   指定每一项命令行参数的替代字符串,类似一个存储参数项的中间变量  
-r   当输入不包括任何非空格时,不执行命令  
实例1 不带任何选项的 xargs

xargs 命令大部分是和管道一起使用,但是它也可以单独使用, 这时候xargs相当于 echo 命令,把用户的输入通过echo命令输出到屏幕

[root@ecs-centos-7 ~]# xargs hello world ! ( ctrl + d ) hello world ! [root@ecs-centos-7 ~]#

上面的例子中,输入xargs 并回车之后,开始接受用户输入,用户输入 hello world !后,按 ctrl + d 结束输入,结束之后,屏幕上会输出用户输入的内容

实例2 -d 选项

-d选项可以指定 xargs 命令的分隔符

[root@ecs-centos-7 ~]# echo -n "a#b#c" | xargs echo a#b#c [root@ecs-centos-7 ~]# echo -n "a#b#c" | xargs -d "#" echo a b c

上面实例中,指定分隔符为 # ,所以 "a#b#c" 就被转换成了 a b c 三个命令行参数了

实例3 -p 选项

-p选项会打印出将要执行的命令,并且执行命令前做依次是否执行的二次确认,y 表示确认执行,n 表示取消执行

[root@ecs-centos-7 tmp]# echo "a b c" | xargs -p touch touch a b c ?...y [root@ecs-centos-7 tmp]# ll 总用量 0 -rw-r--r-- 1 root root 0 1月 20 00:46 a -rw-r--r-- 1 root root 0 1月 20 00:46 b -rw-r--r-- 1 root root 0 1月 20 00:46 c 实例4 -t 选项

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

[root@ecs-centos-7 tmp]# ll 总用量 0 -rw-r--r-- 1 root root 0 1月 20 00:49 a -rw-r--r-- 1 root root 0 1月 20 00:49 b -rw-r--r-- 1 root root 0 1月 20 00:49 c [root@ecs-centos-7 tmp]# echo "a b c" | xargs -t rm rm a b c 实例5 -0 选项

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

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

下面的例子重现了问题

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

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

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

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

上述的问题可以通过 -0 选项结合find 命令来解决

[tt@ecs-centos-7 tmp]$ ls a.txt b 1.txt c.txt [tt@ecs-centos-7 tmp]$ find . -type f -print0 | xargs -0 -t rm rm ./a.txt ./b 1.txt ./c.txt [tt@ecs-centos-7 tmp]$ ll 总用量 0 [tt@ecs-centos-7 tmp]$

find 命令的 -print0 选项表示输出的文件列表以 null 分隔

同时,xargs 命令的 -0 选项表示以 null 作为分隔符

从输出结果可以看出,-0选项结合find命令可以正确的删除包含空格的文件名

实例6 -n 选项

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwgdgf.html