You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何跟踪递归cp命令的完成进度?rsync使用问题解惑

跟踪大型cp -r或rsync任务进度的实用方法

嘿,我来帮你搞定这个进度跟踪的问题!你想要给cp -r加进度显示,同时之前用rsync时遇到了目录跳过的错误,我这就把细节都讲清楚:

一、给cp -r加百分比进度

默认的cp命令(GNU版本)只有-v(显示文件列表)或--progress(显示单个文件进度),但没法直接显示整个目录同步的总进度。这时候可以用pv(Pipe Viewer)工具来实现,它专门用来监控管道数据的传输进度:

方法1:结合tarpv(推荐)

这个方法能精准显示总进度,因为先计算源目录的总大小,再让pv基于这个大小显示百分比:

# 先计算源目录的总字节数
SOURCE_SIZE=$(du -sb orig | awk '{print $1}')
# 打包源目录 → 用pv显示进度 → 解压到目标目录
tar cf - orig | pv -s $SOURCE_SIZE | tar xf - -C dest

执行后你会看到清晰的百分比、传输速度、剩余时间,非常直观。

方法2:直接给cppv

如果不想用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 -Prsync --progress这些命令只加了进度参数,但没加-r(递归)或-a(归档,包含递归+属性保留),所以rsync遇到目录就直接跳过了。

正确的rsync进度命令

推荐这两个常用的组合,满足不同的进度需求:

  1. 单个文件进度+断点续传:用-P(等于--partial --progress),再加上-a(归档模式,比-r更全面,保留权限、时间戳等)

    rsync -aP orig/ dest/
    

    注意:源目录后面的/很重要!加/表示同步orig里的内容到dest;不加的话会把orig整个目录复制到dest下(即生成dest/orig)。

  2. 全局总进度显示:如果你想看整个同步任务的百分比(而不是每个文件的进度跳来跳去),用--info=progress2参数:

    rsync -a --info=progress2 orig/ dest/
    

    这个参数会显示整体的完成百分比、总传输量、速度,适合大型目录同步,能一眼看到全局进度。

总结

  • 若坚持用cp:优先用tar + pv的组合来获取总进度百分比;
  • 若转用rsync:推荐rsync -aP(兼顾单个文件进度和断点续传)或rsync -a --info=progress2(全局总进度),记得加-a-r递归参数,避免目录被跳过。

内容的提问来源于stack exchange,提问作者Evhz

火山引擎 最新活动