pv 给管道加进度条
pv(Pipe Viewer)插在管道中间统计流量:当前速率、已传输量、耗时与 ETA 一目了然,-L 可以限速、-N 给管道加标签区分多路。它不参与数据处理,只观察流过的字节。没有安装权限时,dd status=progress 或 rsync --info=progress2 能提供类似效果。
基本信息
| 适用平台 | Linux/macOS(需要安装 pv 包) |
|---|---|
| 语法 | pv [选项] [文件] | 后续命令 |
| 常用选项 | -s 总量、-L 限速、-N 标签、-p 进度条、-t 计时、-e ETA |
| 限速写法 | 支持 2m 这类人类可读单位 |
| 替代方案 | dd status=progress、rsync --info=progress2 |
典型使用场景
- 大文件复制或备份时确认是否还在推进
- 导入大 SQL 文件到数据库前估算剩余时间
- 跨机房传输限速,避免占满专线影响业务
- 压缩、打包等长任务观察吞吐是否正常
- 多路并行传输用 -N 标签区分进度来源
常用示例
常用示例
pv backup.tar.gz > /mnt/usb/backup.tar.gz # 复制文件并显示进度
pv -s $(stat -c %s db.sql) db.sql | mysql appdb # 给总量才有百分比与 ETA
tar cf - /data/site | pv -s $(du -sb /data/site | cut -f1) | gzip > site.tar.gz
pv -L 2m big.iso > /dest.iso # 限速 2MB/s,保护链路
cat a.log | pv -N a.log | wc -l # 给管道加标签,多路时便于区分
dd if=/dev/sdb of=/dev/sdc bs=16M status=progress # 没装 pv 时的替代写法
rsync -a --info=progress2 /data/ /backup/ # 备份场景的替代写法常用选项
| 选项 | 作用 | 注意 |
|---|---|---|
| -s 总量 | 告知总字节数 | 才有百分比与 ETA,需用 du -sb 而不是 du -sh |
| -L 速率 | 限速,如 -L 2m | 跨专线传输时保护关键业务带宽 |
| -N 标签 | 给这条管道命名 | 多路并行时区分输出 |
| -p / -t / -e | 进度条、已用时间、剩余时间 | 常一起用,信息最完整 |
| -W | 按显示宽度处理宽字符 | 文件名含中文时对齐更正常 |
| -f | 强制输出统计 | 输出被重定向进文件时的处理办法 |
-L 是软限制:实际速率会抖动,关键链路的限速要留出余量,大批量传输尽量安排在业务低峰期。
-s 与实际数据量口径不一致时(例如中间有压缩、或统计的是目录估算值)会显示超过 100% 或迟迟到不了 100%,此时以最终文件大小与校验值为准。
单位写法很友好:-L 支持 500k、2m 这类写法。脚本里只需要速率值时用 -r 只输出速率,需要时长信息时再组合 -p 进度、-t 计时、-e 剩余时间。