xargs 是什么
xargs 把标准输入的每一段变成命令行参数,解决「管道后面接的命令不读标准输入」的问题。它按空白与换行切分输入,默认攒到一定数量才执行一次,还支持并行执行与占位符替换。切分规则既是它的能力也是它的坑:文件名里的空格会被当成参数分隔符。
基本信息
| 适用平台 | Linux、Unix 通用,GNU findutils 提供 |
|---|---|
| 命令语法 | 命令 | xargs [选项] 目标命令 |
| 常用选项 | -n 每批参数个数 / -I 占位替换 / -P 并行度 / -0 以空字符分隔 / -r 空输入不执行 / -t 执行前打印 / -d 自定义分隔符 |
| 安全前提 | 输入不可信或可能含空格时,必须用空字符分隔输入 |
典型使用场景
- 把文件清单交给不读标准输入的命令处理
- 批量下载:每行一个地址逐个请求
- 批量压缩或删除,并控制每批的数量
- 并行处理以缩短总耗时
- 与查找命令的空字符输出配对,安全传递文件名
常用示例
常用示例
find . -name '*.log' -print0 | xargs -0 -r gzip -9
cat urls.txt | xargs -n 1 curl -sO # 逐个下载
cat list.txt | xargs -I{} cp {} /backup/ # 占位替换
find . -name '*.tmp' -print0 | xargs -0 -P4 -n 20 rm -f
echo 'a b c' | xargs -n 1 echo # 逐个输出常用选项
| 选项 | 作用 | 提示 |
|---|---|---|
| -n N | 每批最多 N 个参数 | 控制单次命令的规模 |
| -I 占位符 | 用占位符替换位置 | 一次只能跑一条,效率较低 |
| -P N | 并行执行 N 个进程 | 输出会交错 |
| -0 | 输入按空字符分隔 | 与空字符输出配对 |
| -r | 输入为空时不执行 | 避免空输入误触发 |
| -t | 执行前打印命令 | 调试时看清实际执行的命令 |
| -d 分隔符 | 自定义输入分隔符 | 处理非空白分隔的输入 |
不加空字符分隔时,输入里的引号会被解释,文件名带空格会被拆错;来自不可信来源的输入甚至能构造出额外命令。处理文件名一律用空字符分隔。
输入为空时,部分实现默认仍会执行一次目标命令(不带参数),加 -r 可以避免这种误触发,脚本里尤其要注意。