管道、tee 与 xargs 怎么配合
管道把上一条命令的标准输出交给下一条;tee 在把数据送下去的同时另存一份到文件;xargs 把一列文本变成命令行参数,用来批量处理。这三个工具组合起来是运维脚本的基本功:采集信息时留存原始输出、批量操作时避免参数过长。安全要点是处理文件名时用 -print0 与 -0 配对,避免空格与换行造成参数错位。
基本信息
| 适用平台 | 全部 Linux 发行版(GNU coreutils 与 findutils) |
|---|---|
| tee 常用选项 | -a 追加、-i 忽略中断、可同时写多个文件 |
| xargs 常用选项 | -n 每批参数数、-I{} 占位替换、-0 空字符分隔、-r 空输入不执行 |
| 安全前提 | 文件名可能含空格、引号与换行 |
| 权限要求 | 按具体操作而定 |
典型使用场景
- 留证采集:命令输出既在屏幕显示又写入日志文件,便于事后核对
- 批量清理:按条件找出临时文件后一次性删除,避免逐个执行
- 批量校验:对上千个日志文件计算校验和并汇总到清单
- 参数过长的场景:文件数量超出命令行长度上限时用 xargs 分批调用
- 脚本串联:把查询结果直接作为下一步操作的输入,减少中间文件
典型用法
典型用法
df -h | tee /var/log/disk-snapshot.log # 屏幕显示并同时落盘
command | tee -a /var/log/audit.log | tail -5 # 追加写入,只看最后几行
find /tmp -name '*.tmp' -print0 | xargs -0 -r rm -f # 安全删除,空输入不执行
find /data -type f -name '*.log' -print0 | xargs -0 -n 50 sha256sum > /tmp/logs.sha256
ls *.rpm | xargs -I{} cp -v {} /data/repo/ # 逐个替换占位符复制
find /data -type f -size +100M -print | xargs -r ls -lh # 干跑:先只列出待处理清单关键选项读法
| 选项 | 作用 | 使用要点 |
|---|---|---|
| tee -a | 追加而非覆盖 | 日志类场景必用,否则历史记录被清空 |
| xargs -n 50 | 每次传 50 个参数 | 控制单次调用的参数规模 |
| xargs -I{} | 用占位符替换 | 每条输入单独执行一次命令,速度较慢 |
| xargs -0 | 以空字符分隔 | 必须配合 find -print0,处理特殊文件名 |
| xargs -r | 空输入不执行 | GNU 扩展,删除类操作建议加上 |
| xargs -p | 执行前询问确认 | 交互式核对每个操作,脚本中不用 |
xargs 拼出来的命令在执行前先 echo 预演一遍,确认文件清单与参数无误再真正执行,删除类操作尤其要养成这个习惯。
find 与 xargs 之间不加 -0 配对时,文件名里的空格会被拆成两个参数,跨平台脚本建议统一用 -print0 | xargs -0 写法。