749 字
4 分钟
xargs用法

xargs命令来自英文词组extended arguments的缩写,用作给其他命令传递参数的过滤器。xargs命令能够处理从标准输入或管道符输入的数据,并将其转换成命令参数,也可以将单行或多行输入的文本转换成其他格式。

-i参数#

xargs一般与管道命令一起使用,下面给出与find一起使用的示例:

Terminal window
find . -type f ! -name "*.sh" | xargs chmod -x

但考虑到 find 命令的 -exec 传参的用法与 xargs 不一样,也可以在 xargs 后使用 -i 参数来统一格式。 -i 的本质是使用 {} 来代替传入的字符串,另一个参数 -I 允许使用自定义字符串来代替传入字符串,使用代替字符串可以使得操作变得更灵活。

Terminal window
find . -type f ! -name "*.sh" -exec chmod {} \; #这是-exec的用法
find . -type f ! -name "*.sh" | xargs -i chmod -x {} #这是xargs的用法

-d 参数#

默认情况下,xargs将换行符和空格作为分隔符,把标准输入分解成一个个命令行参数。这时,如果我们传入的参数本身带有空格的话,空格不会被自动转义。

Terminal window
echo file1 file2 file3 | xargs mkdir

这里 mkdir 会创建三个文件,但我们只想创建一个名为file1 file2 file3的文件,这时可以使用 -d 更改默认分隔符。

Terminal window
echo file1 file2 file3 | xargs -d '\t' mkdir

我们将默认分隔符更改为了 '\t' 也就是制表符,因此上述空格被认为是参数的一部分。

-p -t 参数#

-p 参数会在执行命令前打印命令,并询问用户是否需要执行。 -t 参数则是只会在执行命令前打印命令,然后执行命令,不请求用户确认。

-0 参数#

因为 xargs 默认将空格作为分隔符,在处理文件名的时候可能出问题(Linux虽不提倡,但文件名还是允许出现空格,Windows文件名则大量采用了空格)。

find 命令有一条 -print0 参数,指定输出的文件列表以 null 分隔, xargs-0 参数则指定使用 null 作为分隔符。

Terminal window
find /path -type f -print0 | xargs -0 rm

这条命令删除/path路径下的所有文件。由于分隔符是null,所以处理包含空格的文件名也不会报错。

--max-procs 参数#

xargs默认只用一个进程执行命令。如果命令要执行多次,必须等上一次执行完,才能执行下一次。

--max-procs参数指定同时用多少个进程并行执行命令。--max-procs 2表示同时最多使用两个进程,--max-procs 0表示不限制进程数。

Terminal window
docker ps -q | xargs -n 1 --max-procs 0 docker kill # -n表示每次只将一项作为参数

上面命令表示,同时关闭尽可能多的 Docker 容器,这样运行速度会快很多。

xargs用法
https://blog.lancersoul.top/posts/xargs-usage/
作者
Lancer Soul
发布于
2025-05-15
许可协议
CC BY-NC-SA 4.0