xargs命令是给其他命令传递参数的一个过滤器,也是组合多个命令的一个工具。它擅长将标准输入数据转换成命令行参数,xargs能够处理管道或者stdin并将其转换成特定命令的命令参数。

xargs也可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行。xargs的默认命令是echo,空格是默认定界符。这意味着通过管道传递给xargs的输入将会包含换行和空白,不过通过xargs的处理,换行和空白将被空格取代。xargs是构建单行命令的重要组件之一。

一、基本用法

xargs用作替换工具,读取输入数据重新格式化后输出。-n选项指定换行,-d选项指定分隔符。

ma@ubuntu:/tmp$ cat tmp # 测试文本内容
a b c d e f
gh i jkl
ma@ubuntu:/tmp$ cat tmp | xargs # 重新格式化输出
a b c d e f gh i jkl
ma@ubuntu:/tmp$ cat tmp | xargs -n 3 # 每三个换行
a b c
d e f
gh i jkl    
ma@ubuntu:/tmp$ echo "abcXdefXghiXjkl" | xargs -n3 -dX # 以字符X分隔,每三个换行
abc def ghi
jkl

二、命令行参数

xargs一个更常见的用法是通过管道将命令输出作为另外一个命令的参数,对于一些无法直接通过管道来获取输入的命令来说十分适用。

# 创建测试文件
ma@ubuntu:/tmp$ touch a.txt b.txt c.txt d.txt
ma@ubuntu:/tmp$ ls *.txt
a.txt  b.txt  c.txt  d.txt
# 把ls出来的结果全部删除掉
ma@ubuntu:/tmp$ ls *.txt | xargs rm
ma@ubuntu:/tmp$ ls *.txt
ls: cannot access ''*.txt'': No such file or director

对于像cp这种有源目地址的命令来说需要通过-i选项和标识符{}来占位:

ma@ubuntu:/tmp/maqian$ touch a.txt b.txt c.txt d.txt
ma@ubuntu:/tmp/maqian$ tree
.
├── a.txt
├── b.txt
├── c.txt
├── d.txt
└── tmp

1 directory, 4 files

把所有的txt文件复制到tmp文件夹:

ma@ubuntu:/tmp/maqian$ ls *.txt | xargs -i cp {} tmp/
ma@ubuntu:/tmp/maqian$ tree
.
├── a.txt
├── b.txt
├── c.txt
├── d.txt
└── tmp
    ├── a.txt  # 文件都已经复制过来了
    ├── b.txt
    ├── c.txt
    └── d.txt

1 directory, 8 files
最后修改:2018 年 05 月 04 日
如果觉得我的文章对你有用,请随意赞赏