xargs 的 -I 参数定义自定义占位符(如 {}、X),将每个输入参数逐一替换到命令任意位置,启用后自动变为单参数模式(-n 1),且占位符需显式指定并原样使用。

xargs 中的 -I 参数用于定义一个自定义占位符(如 {}、@@ 等),让输入的每个参数能被插入到下游命令中任意位置,而不局限于默认的末尾。
占位符必须显式指定且区分大小写
使用 -I 时需紧跟一个字符串作为占位符(不能有空格),例如 -I {} 或 -I FILE。这个字符串会在后续命令中**原样出现**,xargs 会用当前处理的参数逐一替换它。注意:{} 在这里只是常见约定,不是语法关键字——你可以用任何字符串,比如 -I %、-I path,只要命令里也用同样的字符串即可。
-
echo file1.txt file2.log | xargs -I {} cp {} /backup/→ 执行cp file1.txt /backup/和cp file2.log /backup/ -
printf '%s\n' a b c | xargs -I X echo "start-X-end"→ 输出三行:start-a-end、start-b-end、start-c-end
支持在命令中多次、任意位置使用占位符
与默认行为(参数只能追加到命令末尾)不同,-I 允许你在命令中重复或灵活摆放占位符,比如放在开头、中间、选项值里,甚至和固定文本混用。
-
ls *.log | xargs -I log mv log log.bak→ 把每个.log文件重命名为.log.bak -
seq 1 3 | xargs -I n sh -c 'echo "item n = $(($n * 2))"'→ 输出item n = 2、item n = 4、item n = 6 -
find . -name "*.tmp" | xargs -I {} bash -c 'rm {} && echo "deleted: {}"'→ 先删文件再打印路径
注意:-I 会禁用默认参数拼接,每次只传一个参数
启用 -I 后,xargs 不再把多个输入合并成一次调用(即自动变为 -n 1 模式)。每行/每个输入都单独执行一次下游命令,哪怕你没加 -n 或 -L。
- 错误预期:
echo a b c | xargs -I X echo X X→ 实际输出三行:a a、b b、c c,而不是一行a b c a b c - 若想批量处理并复用占位符,需配合
-n或-L,但此时-I占位符仍按每组第一个参数替换(其余参数无法单独引用)
替代方案:{} 是默认占位符,无需 -I
如果只用 {} 且放在命令末尾,可省略 -I(直接用 xargs -t 或默认模式)。但一旦需要多处引用、非末尾位置、或换用其他符号,就必须显式写 -I。
- 简洁写法:
find . -name "*.py" -print0 | xargs -0 grep "import os"→ 默认把路径加到 grep 末尾 - 必须用 -I:
find . -name "*.py" | xargs -I {} sh -c 'echo "checking {}"; grep -l "print" {}'→ {} 出现在 echo 和 grep 中











