xargs命令来自英文词组extended arguments的缩写,用作给其他命令传递参数的过滤器。xargs命令能够处理从标准输入或管道符输入的数据,并将其转换成命令参数,也可以将单行或多行输入的文本转换成其他格式。
-i参数
xargs一般与管道命令一起使用,下面给出与find一起使用的示例:
find . -type f ! -name "*.sh" | xargs chmod -x但考虑到 find 命令的 -exec 传参的用法与 xargs 不一样,也可以在 xargs 后使用 -i 参数来统一格式。 -i 的本质是使用 {} 来代替传入的字符串,另一个参数 -I 允许使用自定义字符串来代替传入字符串,使用代替字符串可以使得操作变得更灵活。
find . -type f ! -name "*.sh" -exec chmod {} \; #这是-exec的用法find . -type f ! -name "*.sh" | xargs -i chmod -x {} #这是xargs的用法-d 参数
默认情况下,xargs将换行符和空格作为分隔符,把标准输入分解成一个个命令行参数。这时,如果我们传入的参数本身带有空格的话,空格不会被自动转义。
echo file1 file2 file3 | xargs mkdir这里 mkdir 会创建三个文件,但我们只想创建一个名为file1 file2 file3的文件,这时可以使用 -d 更改默认分隔符。
echo file1 file2 file3 | xargs -d '\t' mkdir我们将默认分隔符更改为了 '\t' 也就是制表符,因此上述空格被认为是参数的一部分。
-p -t 参数
-p 参数会在执行命令前打印命令,并询问用户是否需要执行。
-t 参数则是只会在执行命令前打印命令,然后执行命令,不请求用户确认。
-0 参数
因为 xargs 默认将空格作为分隔符,在处理文件名的时候可能出问题(Linux虽不提倡,但文件名还是允许出现空格,Windows文件名则大量采用了空格)。
find 命令有一条 -print0 参数,指定输出的文件列表以 null 分隔, xargs 的 -0 参数则指定使用 null 作为分隔符。
find /path -type f -print0 | xargs -0 rm这条命令删除/path路径下的所有文件。由于分隔符是null,所以处理包含空格的文件名也不会报错。
--max-procs 参数
xargs默认只用一个进程执行命令。如果命令要执行多次,必须等上一次执行完,才能执行下一次。
--max-procs参数指定同时用多少个进程并行执行命令。--max-procs 2表示同时最多使用两个进程,--max-procs 0表示不限制进程数。
docker ps -q | xargs -n 1 --max-procs 0 docker kill # -n表示每次只将一项作为参数上面命令表示,同时关闭尽可能多的 Docker 容器,这样运行速度会快很多。