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尽可能多的仓库,运行速度相当的快!
参考链接
- xargs 命令教程 阮一峰