xargs命令用法
参考自阮一峰xargs命令教程 xargs 命令教程 - 阮一峰的网络日志 (ruanyifeng.com)
一、为什么要用xargs呢。
unix命令都有参数,有些命令可以接受标准输入(stdin)作为参数
[root@xian-01]# cat /etc/passwd | grep root
[root@xian-01]# grep --help|grep stand
Search for PATTERN in each FILE or standard input.
上面的代码使用了管道命令(|
)。管道命令的作用,是将左侧命令(cat /etc/passwd
)的标准输出转换为标准输入,提供给右侧命令(grep root
)作为参数。
因为grep
命令可以接受标准输入作为参数,所以上面的代码等同于下面的代码。
$ grep root /etc/passwd
但是,大多数命令都不接受标准输入作为参数,只能直接在命令行输入参数,这导致无法用管道命令传递参数。举例来说,echo
命令就不接受管道传参。
$ echo "hello world" | echo
上面的代码不会有输出。因为管道右侧的echo
不接受管道传来的标准输入作为参数。
二、xargs命令作用
xargs命令的作用,是将标准输入转为命令行参数
$ echo "hello world" | xargs echo
hello world
上面的代码将管道左侧的标准输入,转为命令行参数hello world
,传给第二个echo
命令。
xargs
命令的格式如下。
$ xargs [-options] [command]
真正执行的命令,紧跟在xargs
后面,接受xargs
传来的参数。
xargs
的作用在于,大多数命令(比如rm
、mkdir
、ls
)与管道一起使用时,都需要xargs
将标准输入转为命令行参数。
$ echo "one two three" | xargs mkdir
上面的代码等同于mkdir one two three
。如果不加xargs
就会报错,提示mkdir
缺少操作参数。
三、xargs单独使用(用的很少)
xargs
后面的命令默认是echo
。
$ xargs # 等同于 $ xargs echo
四、-d 参数与分隔符
默认情况下,xargs
将换行符和空格作为分隔符,把标准输入分解成一个个命令行参数。
$ echo "one two three" | xargs mkdir
上面代码中,mkdir
会新建三个子目录,因为xargs
将one two three
分解成三个命令行参数,执行mkdir one two three
。
-d
参数可以更改分隔符。
[root@jay ~]# echo a,b,c,|xargs -d "," echo
a b c
五、-n参数
-n
参数指定每次将多少项,作为命令行参数。
$ xargs -n 1 find -name
上面命令指定将每一项(-n 1
)标准输入作为命令行参数,分别执行一次命令(find -name
)。
下面是另一个例子。
$ echo {0..9} | xargs -n 2 echo 0 1 2 3 4 5 6 7 8 9
上面命令指定,每两个参数运行一次echo
命令。所以,10个阿拉伯数字运行了五次echo
命令,输出了五行。
六、--max-procs 参数
xargs
默认只用一个进程执行命令。如果命令要执行多次,必须等上一次执行完,才能执行下一次。
--max-procs
参数指定同时用多少个进程并行执行命令。--max-procs 2
表示同时最多使用两个进程,--max-procs 0
表示不限制进程数。
$ docker ps -q | xargs -n 1 --max-procs 0 docker kill
上面命令表示,同时关闭尽可能多的 Docker 容器,这样运行速度会快很多。