我已经搜索过这个选项,但只找到了涉及自定义补丁的解决方案。它没有显示在 --help 中并且找不到更多信息的事实可能表明答案是“否”,但我希望看到这一点得到确认。
是否可以使用 rsync显示总文件传输进度?
Avi*_*vio 494
现在在 rsync(版本 3.1.0 协议版本 31,使用 Ubuntu Trusty 14.04 测试)中有一种官方方法可以做到这一点。
#> ./rsync -a --info=progress2 /usr .
305,002,533 80% 65.69MB/s 0:00:01 xfr#1653, ir-chk=1593/3594)
Run Code Online (Sandbox Code Playgroud)
我尝试使用我的/usr文件夹,因为我想要此功能来传输整个文件系统,并且/usr似乎是一个很好的代表性示例。
在--info=progress2给出了一个很好的整体百分比,即使它只是一个局部值。事实上,我的/usr文件夹超过 6 个演出:
#> du -sh /usr
6,6G /usr/
Run Code Online (Sandbox Code Playgroud)
并rsync花了很多时间来扫描这一切。所以几乎所有的时间我看到的百分比都完成了大约 90%,但尽管如此,看到某些东西被复制还是令人欣慰的 :)
参考:
Nat*_*ate 69
以下内容适用于 rsync 3.0.0 及以上版本。下面描述的选项是在 2008 年 3 月 1 日的那个版本中引入的。
与--info=progress2一起,您还可以使用--no-inc-recursive选项(或其较短的--no-ir别名)来禁用增量递归。
这将在开始时构建整个文件列表,而不是随着传输的进行逐渐发现更多文件。由于它会在开始之前知道所有文件,因此它将更好地报告整体进度。这适用于文件数量 - 它不会根据文件大小报告任何进度。
这涉及权衡。提前构建整个文件列表会占用更多内存,并且会显着延迟实际传输的开始。正如您所料,文件越多,延迟时间越长,需要的内存也就越多。
以下来自 rsync 手册(来源 - http://rsync.samba.org/ftp/rsync/rsync.html):
-r, --recursive
这告诉 rsync 递归复制目录。另请参阅--dirs (-d)。从 rsync 3.0.0 开始,使用的递归算法现在是增量扫描,它使用的内存比以前少得多,并在完成前几个目录的扫描后开始传输。这种增量扫描只影响我们的递归算法,不会改变非递归传输。也只有在传输的两端都至少是 3.0.0 版本时才有可能。
有些选项需要 rsync 知道完整的文件列表,因此这些选项禁用增量递归模式。其中包括:--delete-before、--delete-after、--prune-empty-dirs 和--delay-updates。因此,当您指定 --delete 时的默认删除模式现在是 --delete-during 当连接的两端至少为 3.0.0(使用 --del 或 --delete-during 请求这种改进的删除模式明确)。另请参阅 --delete-delay 选项,它比使用 --delete-after 更好。
可以使用--no-inc-recursive选项或其较短的--no-ir别名禁用增量递归。
另请参阅https://rsync.samba.org了解特定版本差异(向下滚动并查看发布新闻链接)。
小智 49
您可以使用“pv”(apt-get install pv使用 Debian 和 ubuntu)。我建议监控传输的文件数量,因为传输的数据量与文件大小无关,而是与源和目标之间的增量相关。计数文件将计算一个大增量和另一个小增量的相同进度。这意味着在任何情况下 ETA 估计都可能相差甚远。基于大小的 ETA 仅在您的目的地为空时才有效,在这种情况下,delta == size of source。
一般的想法是为每个从 rsync 'transferred' 的文件发出一行,并用 'pv' 计算这些行:
rsync -ai /source 远程:/dest | pv -les [文件数] >/dev/null
我倾向于备份整个文件系统(有几个原因),在这种情况下,你可以使用便宜得多df获得的文件数量(而非du或find至极会遍历你的源架构中的另一个时间后,rsync的做到了)。-x 选项似乎确保 rsync 保持在同一个源文件系统上(并且不跟随其他内部安装):
rsync -aix /source remote:/dest | pv -les $(df -i /source | perl -ane 'print $F[2] if $F[5] =~ m:^/:') >/dev/null
如果您想以一般方式计算 /source 中的文件,请使用find /source|wc -l(再次警告:I/O 可能会很慢而且很重)。
Dav*_*osh 39
达纳基姆是对的。没有简单的方法可以添加总进度指示器。
这样做的原因是当 rsync 查看要同步的文件列表时,它不知道哪些文件需要更改。如果您正在进行增量传输,则必须提前计算增量本身,以全面了解需要完成的工作。
换句话说,计算有多少工作要做的最简单方法就是实际去做。
小智 30
对于长时间的转会,我很高兴du -s在两边跑。甚至watch -n1 du -s,如果我真的感到焦虑。
watchdu -s定期(此处每 1 秒)执行一个命令(此处)并全屏显示输出。
dan*_*kim 13
基本上没有。您只能使用 --progress 标志显示每个文件的进度,但仅此而已。
我猜你可以围绕它编写一个包装器或使用你已经找到的任何补丁,但你必须问自己是否真的值得,你真的需要 rsync 的总进度吗?
小智 9
我还搜索了如何使用 rsync 显示总进度,我从这篇文章中找到了一个有用的答案:https ://stackoverflow.com/questions/7157973/monitoring-rsync-progress
基本上,您可以在 rsync 3.1.0的开发版本中使用--info=progress2。这是文档所说的:
还有一个 --info=progress2 选项,它基于整个传输而不是单个文件输出统计信息。在不输出文件名的情况下使用此标志(例如,避免使用 -v 或指定 --info=name0,如果您想在不滚动带有大量名称的屏幕的情况下查看传输的进行情况。(您不需要指定 --进度选项以使用 --info=progress2。)
小智 8
我使用了 zerodeux 的答案并编写了我自己的小 bash 脚本:
#!/bin/bash
RSYNC="ionice -c3 rsync"
# don't use --progress
RSYNC_ARGS="-vrltD --delete --stats --human-readable"
SOURCES="/dir1 /dir2 /file3"
TARGET="storage::storage"
echo "Executing dry-run to see how many files must be transferred..."
TODO=$(${RSYNC} --dry-run ${RSYNC_ARGS} ${SOURCES} ${TARGET}|grep "^Number of files transferred"|awk '{print $5}')
${RSYNC} ${RSYNC_ARGS} ${SOURCES} ${TARGET} | pv -l -e -p -s "$TODO"
Run Code Online (Sandbox Code Playgroud)
小智 8
如果您没有最新的 rsync(例如,OS X 有 2.6.9)并且不能使用--info=progress2,这里有另一种替代方法可以使您免于滚动文本页面的进度:
rsync -aPh <source> <destination> | xargs -L1 printf "\33[2K\rTransferring: %s"
这将在一行上打印出正在传输的最新文件的名称:
Transferring: the-latest.file
小智 6
我使用了 zerodeux 的答案并编写了我自己的小 BASH 脚本:
#!/bin/bash
RSYNC="ionice -c3 rsync"
# don't use --progress
RSYNC_ARGS="-vrltD --delete --stats --human-readable"
SOURCES="/dir1 /dir2 /file3"
TARGET="storage::storage"
#echo "Executing dry-run to see how many files must be transferred..."
TODO=$(find ${SOURCES} | wc -l)
${RSYNC} ${RSYNC_ARGS} ${SOURCES} ${TARGET} | pv -l -e -p -s "$TODO"
Run Code Online (Sandbox Code Playgroud)
我将 TODO 试运行更改为
TODO=$(find ${SOURCES} | wc -l)
Run Code Online (Sandbox Code Playgroud)
它查找文件数量非常快!
小智 6
用
lsof -ad3-999 -c rsync
Run Code Online (Sandbox Code Playgroud)
要查看 rsync 当前打开的文件(将显示文件大小),rsync 会在本地复制到隐藏文件中