文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

聊一聊Linux 下 Xargs 命令,你知道吗?

2024-12-03 12:49

关注

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

语法

xargs 语法格式如下

  1. xargs [OPTION]... COMMAND 

作用

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

下面以实例来说明

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

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

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

  1. mkdir 11 
  2. mkdir 22 
  3. mkdir 33 

选项说明

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

实例1 不带任何选项的 xargs

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

  1. [root@ecs-centos-7 ~]# xargs 
  2. hello 
  3. world 
  4. ! ( ctrl + d ) 
  5. hello world ! 
  6. [root@ecs-centos-7 ~]# 

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

实例2 -d 选项

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

  1. [root@ecs-centos-7 ~]# echo -n "a#b#c" | xargs echo 
  2. a#b#c 
  3. [root@ecs-centos-7 ~]# echo -n "a#b#c" | xargs -d "#" echo 
  4. a b c 

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

实例3 -p 选项

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

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

实例4 -t 选项

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

  1. [root@ecs-centos-7 tmp]# ll 
  2. 总用量 0 
  3. -rw-r--r-- 1 root root 0 1月  20 00:49 a 
  4. -rw-r--r-- 1 root root 0 1月  20 00:49 b 
  5. -rw-r--r-- 1 root root 0 1月  20 00:49 c 
  6. [root@ecs-centos-7 tmp]# echo "a b c" | xargs -t rm 
  7. rm a b c 

实例5 -0 选项

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

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

下面的例子重现了问题

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

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

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

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

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

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

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

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

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

实例6 -n 选项

有时用户会输入多个参数,-n 选项是每次将一行中的多少个参数作为命令行参数

  1. [tt@ecs-centos-7 tmp]$ echo "a b c d e f" | xargs -n 2 
  2. a b 
  3. c d 
  4. e f 
  5. [tt@ecs-centos-7 tmp]$ echo "a b c d e f" | xargs -n 4 
  6. a b c d 
  7. e f 
  8. [tt@ecs-centos-7 tmp]$ 

命令 echo "a b c d e f" | xargs -n 2 指定每2个参数作为一次命令的输出,所以 a b c d e f 6个参数输出了3行

同样的,命令 echo "a b c d e f" | xargs -n 4 指定每4个参数作为一次输出,所以 a b c d e f 6个参数输出2行,而且第2行只有两个参数

实例7 -r 选项

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

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

  1. [tt@ecs-centos-7 tmp]$ echo '' | xargs rm                                                                                              
  2. rm: 缺少操作数 
  3. Try 'rm --help' for more information. 
  4. [tt@ecs-centos-7 tmp]$ echo '' | xargs -r rm                                                                                           
  5. [tt@ecs-centos-7 tmp]$ 

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

实例8 -I 参数

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

  1. [tt@ecs-centos-7 tmp]$ ls 
  2. a  b  c 
  3. [tt@ecs-centos-7 tmp]$ ls | sort | xargs -I F sh -c 'echo F.txt; touch F.txt'                                                          
  4. a.txt 
  5. b.txt 
  6. c.txt 
  7. [tt@ecs-centos-7 tmp]$ ls 
  8. a  a.txt  b  b.txt  c  c.txt 

上面例子中,当前目录有 a b c 三个文件

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

  1. echo a.txt; touch a.txt 
  2. echo b.txt; touch b.txt 
  3. echo c.txt; touch c.txt 

小结

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

 

来源:Linux开发那些事儿内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯