跳转到内容

xargs-guide

xargs(eXtended ARGuments)是 Linux 系统中给命令传递参数的一个过滤器。

  • 核心功能:它可以读取标准输入(stdin)、文件或管道输出,并将其转换为另一个命令的命令行参数。
  • 解决痛点:许多 Linux 命令(如 echo, rm, mkdir 等)本身 不支持直接从管道接收参数,xargs 充当了管道输出到命令参数的桥梁。

启用调试输出模式,在执行命令之前,先在标准错误输出上打印出即将执行的完整命令。

Terminal window
echo "file1 file2" | xargs -t touch
# 输出:touch file1 file2

2.2. -n:指定每次执行的参数个数

Section titled “2.2. -n:指定每次执行的参数个数”

限制每次命令调用时传递的参数最大数量。

假设 test.txt 内容如下:

a b c d e f g
h i j k l m n

使用 -n3 限制每次仅传递 3 个参数:

Terminal window
cat test.txt | xargs -n3

输出结果:

a b c
d e f
g h i
j k l
m n

xargs 默认以换行符和空格作为定界符。使用 -d 参数可以指定自定义的定界符。

Terminal window
echo "nameXnameXnameXname" | xargs -dX

输出结果(定界符 X 被替换为空格):

name name name name

使用指定的占位符(如 {})在后续命令的特定位置进行参数替换。这允许你在命令的中间部位插入参数,而不仅仅是追加在尾部。

假设 arg.txt 内容如下:

aaa
bbb
ccc

执行如下命令:

Terminal window
cat arg.txt | xargs -I {} echo "Prefix -> {} -> Suffix"

输出结果:

Prefix -> aaa -> Suffix
Prefix -> bbb -> Suffix
Prefix -> ccc -> Suffix

当文件名包含空格、换行符或特殊字符时,默认的分隔符会导致 xargs 错误切割文件名。此时必须配合 find 命令的 -print0 参数使用。

Terminal window
find . -type f -name "*.log" -print0 | xargs -0 rm -f