--progress显示每个文件传输时的实时进度信息,包括文件名、已传百分比与字节数、瞬时速率及预估剩余时间;-P等价且自动启用断点续传,推荐使用。

rsync --progress 显示每个文件的实时进度
默认 rsync 不输出任何传输状态,光标空转容易误判卡死。加 --progress 是最直接的解法,它会在每个文件传输时动态刷新三行信息:当前文件名、已传百分比与字节数、瞬时速率和预估剩余时间。
常见错误是以为加了就“有进度条”,其实它不画 ASCII 进度条,只是滚动文本;另外,如果源是目录且含数百小文件,终端会被刷屏,根本看不出整体完成度。
-
--progress和-P等价,后者更短,还自动启用--partial(断点续传),推荐优先用-P - 速率值是滑动窗口计算,前几秒波动大,别急着怀疑带宽
- 百分比基于当前文件大小,不是整个任务的全局进度
- SSH 远程传输时同样生效,但若远程端 rsync 版本太老(--progress
rsync --info=progress2 显示整体传输进度
当你同步的是一个大目录(比如 50GB 的 /var/log 或虚拟机镜像集),--progress 会为每个文件单独刷屏,信息噪音太大。--info=progress2 才是你真正需要的“总进度”模式——它只输出一行,持续更新全局已传比例、总速、已用时间和预估完成时间。
注意:progress2 是 rsync 3.1.0+ 引入的,Ubuntu 22.04+、CentOS 8+ 默认满足;老系统(如 CentOS 7 自带 rsync 3.0.9)会报错 unknown info flag 'progress2',此时只能降级用 --progress 或手动升级 rsync。
- 必须写成
--info=progress2,等号不能省,也不能写成--info progress2 - 它不显示单个文件名,所以无法知道“当前卡在哪个文件”,适合后台静默跑大任务
- 配合
-v可在开头列出将要处理的文件,但不会干扰进度行刷新 - 如果传输中途被 Ctrl+C 中断,
progress2的统计值会清零重算,下次运行从头开始计
为什么加了参数还是没看到进度?几个硬坑
不是所有“看起来像 rsync 进度”的问题都出在参数上。以下情况即使写了 --progress 或 --info=progress2,你也看不到刷新:
- 源路径末尾多了一个
/,而目标路径不存在——rsync 会先创建目标目录,期间完全静默,直到第一份数据开始流动才出进度 - 用了
--dry-run(-n):它禁用所有实际传输,自然也没进度可显示 - 管道或重定向了 stdout/stderr,比如
rsync ... > log.txt,进度信息被吞掉,得显式加2>&1才能捕获 - 终端宽度太窄(
$COLUMNS ),某些版本的 rsync 会自动降级为静默模式,临时执行 <code>export COLUMNS=120再试
本地大文件拷贝也建议用 rsync -P
很多人只把 rsync 当远程工具,其实本地复制大文件(比如 20GB 的 disk.img)时,rsync -avhP /src/disk.img /dst/ 比 cp 更可靠:它自带校验、支持中断续传、能实时反馈,而且万一断电,--partial 保下的半成品文件还能接着传。
唯一要注意的是:cp 默认不校验,rsync 在结束前会做一次最终校验(哪怕没加 --checksum),所以最后几秒可能“卡住”,这不是 bug,是它在确认数据一致性。


















