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.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 命令来解决

[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 选项

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

[tt@ecs-centos-7 tmp]$ echo "a b c d e f" | xargs -n 2
a b
c d
e f
[tt@ecs-centos-7 tmp]$ echo "a b c d e f" | xargs -n 4
a b c d
e f
[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 选项就不会出现错误提示了

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

[tt@ecs-centos-7 tmp]$ echo '' | xargs -r rm
[tt@ecs-centos-7 tmp]$

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

实例8 -I 参数

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

[tt@ecs-centos-7 tmp]$ ls
a  b  c
[tt@ecs-centos-7 tmp]$ ls | sort | xargs -I F sh -c 'echo F.txt; touch F.txt'
a.txt
b.txt
c.txt
[tt@ecs-centos-7 tmp]$ ls
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 会被实际的参数替换掉,实际会执行下面几条命令

echo a.txt; touch a.txt
echo b.txt; touch b.txt
echo c.txt; touch c.txt

小结

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

Original: https://www.cnblogs.com/wanng/p/xargs-cmd.html
Author: Linux开发那些事儿
Title: Linux 下 xargs 命令

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/606738/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • NJU软件分析笔记(1)

    课程链接本次课程主要内容 Compilers and Static Analyzers AST vs. IR IR: Three-Address Code (3AC) 3AC in…

    Linux 2023年6月8日
    0110
  • 正则表达式

    1.正则表达式分类 正则表达式:REGEXP,REGular EXPression。正则表达式分为两类: Basic REGEXP(基本正则表达式) Extended REGEXP…

    Linux 2023年6月6日
    087
  • 用go把博客园博客下载到本地Hexo目录下

    找到cookie 直接浏览器F12 巴拉巴拉 直接上代码 用hexo建静态博客的话,go文件在 \source\_posts目录下,run之后将会在此目录下生成cnblogs文件夹…

    Linux 2023年6月7日
    079
  • ASP.NET Core设置URLs的几种方法

    前言 在使用ASP.NET Core 3.1开发时,需要配置服务器监听的端口和协议,官方帮助文档进行简单说明,文档中提到了4种指定URL的方法 设置 ASPNETCORE_URLS…

    Linux 2023年6月8日
    071
  • su与su -,sudo 的区别

    “sudo” , “su” , “su – ” 区别; 一、sudo是一种权限管理机制,依赖于/…

    Linux 2023年6月13日
    0120
  • Linux使用SNAT实现局域网上网

    1、一台能上网的Linux机器 2、操作步骤 host-10-11 配置snat,开启路由转发 iptables -t nat -A POSTROUTING -s 10.10.10…

    Linux 2023年6月6日
    082
  • linux下利用inode删除文件

    由于 linux下中文编码和在Windows中的中文编码可能不同,在一定的条件下,linux的文件夹可能会存在乱码的情况就算一些乱七八糟的字符。如问号的文件名,这样的文件使用rm …

    Linux 2023年6月6日
    0100
  • [LINUX] 在 Win10 上搭建好用的终端开发环境:windows terminal + git bash + zsh + oh-my-zsh

    1、安装 git for windows 2、安装终端 2.1 Windows Terminal 2.1.1 安装 Windows Terminal 2.1.2 设置 Window…

    Linux 2023年6月8日
    091
  • Ajax 技术(四)

    目的: 熟练掌握AJAX基础和XMLHttpRequest对象及其方法。 重点掌握AJAX发送请求的具体过程,及过程中的不同状态。 要求: 实现用户注册表单中,使用AJAX技术根据…

    Linux 2023年6月13日
    0103
  • 设计模式——命令模式

    命令模式定义 将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和回复的功能。 Receive接收者角色 该角色就是干活…

    Linux 2023年6月7日
    0101
  • 笔记:linux 总结

    1.开始 Linux,全称GNU/Linux,是一种免费使用和自由传播的类UNIX操作系统,其内核由林纳斯·本纳第克特·托瓦兹于1991年10月5日首次发布,它主要受到Minix和…

    Linux 2023年5月27日
    0145
  • vue组件传值和路由——day04

    <script><br> var vm = new Vue({<br> el: ‘#app’,<br> data: {<br&…

    Linux 2023年6月7日
    091
  • Linux——配置主从数据库服务

    主从数据库 Linux中,数据库服务有三种:互为主主,互为主从,一主一从(主从数据库) 服务名 mariadb 协议名 mysql 进程名称 mysqld 端口号 3306 一、改…

    Linux 2023年5月27日
    0103
  • 计算机网络学习任务

    自学分析题 请分析,一个5KHz的无噪声信道能够达到的最大数据传输率是多少? 为什么? 假设你使用的宽带是100Mbps,你要把一个0.5GB的文件发送出去, 理论上要花多长时间?…

    Linux 2023年6月6日
    0131
  • TortoiseGit使用

    ​ 一:TortoiseGit安装以及配置 1.1、安装包 TortoiseGit以及配套安装包见链接: git下载链接 Download PuTTY TortoiseGit下载 …

    Linux 2023年6月13日
    080
  • 关于网络安全防护架构中的DMZ区

    公司有一个网站群的业务,应用规模比较大,目前计划是从传统的虚拟机部署方式迁移到内部的私有云。 这种迁移的动作是一个很好的学习机会。在交流的时候的时候,领导有提到现有的架构基本上是参…

    Linux 2023年6月14日
    095
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球