如何跟踪递归cp命令的完成进度?rsync使用问题解惑
cp -r或rsync任务进度的实用方法 嘿,我来帮你搞定这个进度跟踪的问题!你想要给cp -r加进度显示,同时之前用rsync时遇到了目录跳过的错误,我这就把细节都讲清楚:
一、给cp -r加百分比进度
默认的cp命令(GNU版本)只有-v(显示文件列表)或--progress(显示单个文件进度),但没法直接显示整个目录同步的总进度。这时候可以用pv(Pipe Viewer)工具来实现,它专门用来监控管道数据的传输进度:
方法1:结合tar和pv(推荐)
这个方法能精准显示总进度,因为先计算源目录的总大小,再让pv基于这个大小显示百分比:
# 先计算源目录的总字节数 SOURCE_SIZE=$(du -sb orig | awk '{print $1}') # 打包源目录 → 用pv显示进度 → 解压到目标目录 tar cf - orig | pv -s $SOURCE_SIZE | tar xf - -C dest
执行后你会看到清晰的百分比、传输速度、剩余时间,非常直观。
方法2:直接给cp加pv
如果不想用tar,也可以把cp的输出重定向给pv,不过需要先知道总大小:
cp -r orig dest 2>&1 | pv -s $SOURCE_SIZE > /dev/null
这个方法会显示进度,但cp的-v输出会混在进度里,不如tar的方法干净。
另外,部分Linux发行版的cp可能自带--show-progress参数(比如较新的GNU cp),直接用cp -r --show-progress orig dest也能看到每个文件的进度,但还是没有总百分比。
二、解决rsync的“skipping directory”错误&优化进度显示
你之前遇到的“skipping directory source”错误,核心原因是rsync默认不会递归处理目录,必须加上递归参数才能同步文件夹:
为什么之前的命令出错?
rsync -P、rsync --progress这些命令只加了进度参数,但没加-r(递归)或-a(归档,包含递归+属性保留),所以rsync遇到目录就直接跳过了。
正确的rsync进度命令
推荐这两个常用的组合,满足不同的进度需求:
单个文件进度+断点续传:用
-P(等于--partial --progress),再加上-a(归档模式,比-r更全面,保留权限、时间戳等)rsync -aP orig/ dest/注意:源目录后面的
/很重要!加/表示同步orig里的内容到dest;不加的话会把orig整个目录复制到dest下(即生成dest/orig)。全局总进度显示:如果你想看整个同步任务的百分比(而不是每个文件的进度跳来跳去),用
--info=progress2参数:rsync -a --info=progress2 orig/ dest/这个参数会显示整体的完成百分比、总传输量、速度,适合大型目录同步,能一眼看到全局进度。
总结
- 若坚持用
cp:优先用tar + pv的组合来获取总进度百分比; - 若转用rsync:推荐
rsync -aP(兼顾单个文件进度和断点续传)或rsync -a --info=progress2(全局总进度),记得加-a或-r递归参数,避免目录被跳过。
内容的提问来源于stack exchange,提问作者Evhz




