Linux命令xargs

xargs 命令的作用

xargs的作用,就是将标准输入转为命令行的参数。

$ echo "你好" | xargs echo

上面的代码将管道(|)左侧的标准输入,转换为命令行的参数 “你好”,传给第二个echo命令。

xargs命令的格式如下。

xargs [-options] [command]

实际执行的命令是command,接受xargs传来的参数。 xargs的作用在于,大多数命令(比如rm, mkdir, ls)与管道一起使用时,都需要xargs将标准输入转换为命令行参数。

$ echo "one two three" | xargs mkdir

上面代码等同于 mkdir one two three. 如果不加xargs就会报错,提示mkdir缺少操作参数。

参数

xargs有很多参数,搭配各种参数可以实现很多有用的功能。

-I参数

如果xargs要将命令行参数传递给多个命令,或需要替换命令中的字符串,可以使用-I参数。 -I指定命令行参数的替代附。

$ cat foo.txt
one
two
three

$ cat foo.txt | xargs -I {} sh -c 'echo {}; mkdir {}'
one
two
three

$ ls
one two three

上面代码中,foo.txt是一个三行的文本文件。我们希望对每一项命令行参数,执行两个命令(echo和mkdir),使用-I file表示file是命令行参数的替代字符串。执行命令时,具体的参数会替代掉echo file; mkdir file里面的两个file。

使用场景-批量执行git clone命令

接收新项目,一下好几十个git仓库,不想一个个copy、clone,而且clone的仓库地址基本一样,就名称不一样。

$ cat repos.txt
root
auth
navbar
message
...

$ cat repos.txt | xargs -I {} sh -c 'git clone ssh://git@gitlab.xxx.com/xxx/{}.git'

还可以再改进下,xargs默认只用一个进程执行命令。上面命令是clone完一个仓库,再执行下一个clone。这样速度不快。 可以使用–max-procs参数指定同时用多个进程执行命令。–max-procs 2表示同时最多使用2个进程,–max-procs 0表示不限制进程数。

cat repos.txt | xargs --max-procs 0 -I {} sh -c 'git clone ssh://git@gitlab.xxx.com/xxx/{}.git'

上面命令表示,同时clone尽可能多的仓库,运行速度相当的快!

参考链接