Shell Daily 2026-03-09: 参数占位 (Xargs Placeholder)

Shell Daily 2026-03-09: 参数占位 (Xargs Placeholder)

xargs 是管道的绝佳搭档,但它默认只能把接收到的参数追加到命令的最末尾。如果你想把参数放在命令的中间(例如复制文件时:cp [文件] /data/backup/),或者在一条复合指令中多次引用同一个参数,普通的 xargs 就束手无策了。

此时,你需要为其设定一个“替身”。

怎么用

使用 -I (大写的 i) 参数定义一个占位符字符串(最常见的是 {})。在后续的命令中,xargs 会自动将这个占位符精确替换为管道传来的实际参数。

  • 语法command | xargs -I {} [包含 {} 的命令]
  • 兼容性POSIX 标准。Linux 和 macOS 皆可通用。

适用场景

  • 批量备份/迁移:将筛选出的文件移动到新目录并统一附加后缀。
  • 复合命令编排:对同一个目标(如 Docker 容器 ID、日志文件)连续执行多步操作。

示例 1:安插在命令中间

找出所有旧的 Nginx 配置文件,并备份到挂载的磁盘,同时修改扩展名。

# 笨办法:写个冗长的 for 循环
# 新技巧:使用 {} 代表 find 传过来的每个文件名
$ find /etc/nginx -name "*.conf.old" | xargs -I {} cp {} /mnt/backup/{}.bak

示例 2:多次复用同一个参数

找出所有异常退出的容器,确保先安全停止,然后再清理掉。这里我们通过 sh -c 结合占位符,实现了对同一个 ID 的两次调用。

# {} 在这里被使用了两次,代表同一个容器 ID
$ docker ps -q -f status=exited | xargs -I {} sh -c 'docker stop {} && docker rm {}'

(注:虽然占位符可以自定义为任何字符如 -I %,但 {} 是自 find -exec 时代传承下来的业界默契,建议保持这个阅读友好的好习惯。)