显示 rsync 的总进度:有可能吗?

Aro*_*eel 308 linux rsync

我已经搜索过这个选项,但只找到了涉及自定义补丁的解决方案。它没有显示在 --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%,但尽管如此,看到某些东西被复制还是令人欣慰的 :)

参考:

  • 还要添加`--no-ir` 开关,因此`rsync` 在复制之前不会增量扫描而是完全扫描,并且知道+显示剩余的工作量。 (59认同)
  • 请注意,您可以使用 `--human-readable`(或 `-h`)来查看以 MB/GB 为单位的总大小。 (24认同)
  • 请注意,这已在 3.1.0 中登陆。同样重要的是要注意,从时间角度来看,这不一定准确。它实质上显示了已验证存在于远程端的数据量。速率是在远程端学习数据正确的速率(无论是已经这样还是传输了新数据并使其正确)。因此,虽然非常有用,但您需要了解注意事项。 (23认同)
  • 值得注意的是 `--info=progress2` 不适用于 `-v` (23认同)
  • @sanmai:是的!它显示详细输出(当前正在处理哪个文件),但不是显示该单个文件的相对进度百分比,而是显示整个 rsync 操作的绝对进度。 (4认同)
  • 一定不要使用`-v`或`-i`,否则会打印出单个文件 (4认同)
  • 对于带有自制软件的 OSX,不再需要“brew tap homebrew/dupes”,因为这些公式已合并到自制软件核心存储库中。所以现在你只需要`brew install rsync` (4认同)
  • 因此,结合有用的评论,我最终得到了 `rsync -ah --no-ir --info=progress2 source dest`(如果源中有尾随的 `/` 或没有,这会有所不同) (2认同)

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了解特定版本差异(向下滚动并查看发布新闻链接)。

  • 感谢这一点,其他答案导致 %age 不断上升和下降! (3认同)

小智 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获得的文件数量(而非dufind至极会遍历你的源架构中的另一个时间后,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 查看要同步的文件列表时,它不知道哪些文件需要更改。如果您正在进行增量传输,则必须提前计算增量本身,以全面了解需要完成的工作。

换句话说,计算有多少工作要做的最简单方法就是实际去做。

  • 您仍然可以有一个简单的指示符,例如(传输的数据 + 跳过的数据)/(源中的总数据)或(传输或跳过的# 个文件)/(源中的# 个文件)。它不会特别准确,但它会给出一个想法。当您在一天结束时进行大型传输时,您想知道是等待并关闭计算机,还是让它运行一整夜时,这很有用…… (42认同)
  • 新人评论:现在可以了:https://serverfault.com/a/441724/422003 (6认同)
  • 我不相信这个结论是正确的。我认为@naught101 对这个问题更公平,我认为预测不使用`--size-only` 或类似的答案更不准确。 (3认同)
  • 在我写回复的时候,它是准确的——rsync 没有一个总进度指示器的机制。是的,您可以自己编写,但很少有人会这样做。 (3认同)

小智 30

对于长时间的转会,我很高兴du -s在两边跑。甚至watch -n1 du -s,如果我真的感到焦虑。

watchdu -s定期(此处每 1 秒)执行一个命令(此处)并全屏显示输出。

  • 不知道你做什么样的长传,du哪里可行。当结果将在 TB 和 M 个文件中时,du 非常慢。 (10认同)
  • 感谢`watch` 命令的例子! (4认同)
  • // , 聪明的!根据 linfo.org 的说法:“du(即磁盘使用情况)命令报告目录树​​的大小,包括其所有内容和单个文件的大小。这对于跟踪空间猪非常有用,即目录和文件占用大量或过多的硬盘驱动器 (HDD) 或其他存储介质空间。” (2认同)
  • 对于我的“长传输”,du 操作大约需要一个小时才能完成,在此期间 rsync 运行速度要慢得多,因为它们正在争夺对磁盘的访问权限。 (2认同)

dan*_*kim 13

基本上没有。您只能使用 --progress 标志显示每个文件的进度,但仅此而已。

我猜你可以围绕它编写一个包装器或使用你已经找到的任何补丁,但你必须问自己是否真的值得,你真的需要 rsync 的总进度吗?

  • 您可以使用“--info=progress2”更改“--progress”的工作方式,它会向您显示全局进度。您需要禁用增量递归算法才能使其有用,因此 `--info=progress2 --no-inc-recursive` (3认同)

小智 9

我还搜索了如何使用 rsync 显示总进度,我从这篇文章中找到了一个有用的答案:https ://stackoverflow.com/questions/7157973/monitoring-rsync-progress

基本上,您可以在 rsync 3.1.0的开发版本中使用--info=progress2。这是文档所说的:

还有一个 --info=progress2 选项,它基于整个传输而不是单个文件输出统计信息。在不输出文件名的情况下使用此标志(例如,避免使用 -v 或指定 --info=name0,如果您想在不滚动带有大量名称的屏幕的情况下查看传输的进行情况。(您不需要指定 --进度选项以使用 --info=progress2。)

  • `--info=name0` 是黄金 (2认同)

小智 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)

它查找文件数量非常快!

  • `find` 仅在您在本地使用 `rsync` 时才有效。`rsync --dry-run` 也适用于远程源...... (4认同)

小智 6

lsof -ad3-999 -c rsync
Run Code Online (Sandbox Code Playgroud)

要查看 rsync 当前打开的文件(将显示文件大小),rsync 会在本地复制到隐藏文件中