我已经搜索了此选​​项,但是只找到了涉及自定义补丁的解决方案。它未在--help中显示并且找不到更多信息的事实可能表明答案为“否”,但我希望确认此结果。

是否可以显示rsync传输文件的总进度是什么?

评论

从rsync 3.1.0开始,现在包括了基本的总文件传输进度。有关详细信息,请参见答案serverfault.com/a/441724/107793。

请更改接受的答案。 @David的回答完全没用。

另请参见unix.stackexchange.com/q/215271/9454

#1 楼

现在,有一种正式的方法可以在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)


我尝试使用/usr文件夹因为我希望使用此功能来传输整个文件系统,而/usr似乎是一个很好的代表性示例。实际上,我的--info=progress2文件夹已超过6个演出:

#> du -sh /usr
6,6G    /usr/


,而/usr花费了很多时间对其进行扫描。因此,几乎所有时间我都已经完成了大约90%的百分比,但是仍然很高兴看到正在复制某些内容:)

参考文献:


https://stackoverflow.com/a/7272339/1396334
https://download.samba.org/pub/rsync/src/rsync-3.1.0-NEWS


评论


请注意,它已降落在3.1.0中。还需要注意的是,从时间角度来看,这不一定是准确的。它实质上显示了已验证存在于远端的数据量。速率是指在远程端得知数据正确的速率(无论是这种方式还是新数据已传输并使其正确)。因此,尽管非常有用,但您需要了解警告。

–凯文·考克斯(Kevin Cox)
13年11月28日在21:11

要在OSX上使用自制软件,请使用“ brew tap homebrew / dupes; brew install rsync”

– Matt Carrier
2014年11月17日在22:36



值得注意的是--info = progress2不适用于-v

– Sanmai
15年3月8日在15:09

还要添加--no-i-r开关,因此rsync在复制之前不会进行增量扫描,而是完全扫描,并且知道+显示剩余的工作量。

– Alex
2015年11月19日下午13:17

请注意,您可以使用--human-可读(或-h)查看正在进行的总大小(MB / GB)。

– Nux
17年8月23日在10:22

#2 楼

以下内容适用于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。因此,当连接两端都至少为3.0.0时,指定--delete时的默认删除模式现在为--delete-during(请使用--del或--delete-during请求此改进的删除模式明确地)。另请参见--delete-delay选项,该选项比使用--delete-after更好。

可以使用--no-inc-recursive选项或其较短的--no-ir别名禁用增量递归。请参见https:/ /rsync.samba.org了解特定的版本差异(向下滚动并查看Release News链接)。

评论


为此,其他答案导致%age持续上升和下降!

– artfulrobot
16年11月29日在16:05

百分比还不是很完美,因为百分比始终是当前传输与数据总量的比率。因此,如果一次传输中断40%,则下一次传输将从0%开始并以60%完成,这有点令人困惑。不过,我认为这比公认的答案清楚得多。

– iFreilicht
10月17日21:18

#3 楼

您可以使用“ pv”(与Debian和ubuntu一起使用apt-get install pv)。我建议监视传输的文件数,因为传输的数据量与文件大小无关,而与源和目标之间的增量有关。对文件进行计数将对一个大增量和另一个小增量进行相同的计数。这意味着在任何情况下ETA估计都可能相差甚远。基于大小的ETA仅在目标为空的情况下才有效,在这种情况下,delta ==源的大小。

一般的想法是从rsync'传输'的每个文件发出一行,并对这些行进行计数带有'pv'的行:文件(而不是dfdu,它们将在rsync执行之后再遍历源层次结构)。 -x选项似乎可以确保rsync停留在相同的源文件系统上(并且不跟随其他内部安装):

rsync -ai /source remote:/dest | pv -les [number of files] >/dev/null


如果要计算/中的文件一般情况下,请使用find(再次警告:可能会导致I / O缓慢而繁重)。

评论


按照zerodeuz的指定,仅在同步整个分区时才使用“ df”,因为df -i / source从/ source所在的所有分区中获取inode(文件)数。否则,请使用“查找”来计数“ $()”表达式内目录中的文件。

–lepe
15/09/17在1:43



du或find的替代方法-假设您要完成不完整的副本或使用Deletes进行就地更新-使用rsync -ai --dry-run可以获取将主运行传递到的相同文件列表光伏

–伊兹卡塔
16-4-24在6:07



#4 楼

danakim是正确的。没有简单的方法可以添加总进度指示器。

原因是当rsync查看要同步的文件列表时,它不提前知道需要哪些文件更改。如果您要进行增量传输,则必须提前计算增量本身,以全面了解需要完成的工作。换句话说,最简单的方法是计算多少要做的工作实际上就是做。

评论


您仍然可以使用一个简单的指示符,例如(已传输数据+跳过数据)/(源中的总数据),或(已传输或已跳过的#个文件)/(源中的#个文件)。它不会特别准确,但是会给出一个想法。当您在一天结束时要进行大型传输时非常有用,并且您想知道是否要等待一下并关闭计算机,还是让它在晚上运行?

–naught101
2012年5月29日下午6:52

我认为结论不正确。我认为@ naught101对这个问题更公平,并且我认为对不使用--size-only或类似内容进行预测的答案更加不准确。

–埃文·卡洛尔(Evan Carroll)
2014年5月24日,0:11

在我写答复时,它是准确的-rsync没有总进度指示器的机制。是的,您可以编写自己的,但很少有人写。

–大卫·麦金托什(David Mackintosh)
14年6月16日在21:11

对新手的评论:现在有可能:serverfault.com/a/441724/422003

–征收者
17年6月25日在23:09

使用两次传递,首先传递“ --dry-run”(期望的文件总数),其次将详细的输出记录到文件中(计数行数完成或使用管道连接到“ pv”),可以轻松估算完成率。缺点是扫描大型嵌套目录两次。根据需要,即确保安全的客户数据迁移,这可能是可以接受的。

–ives
19年1月28日在18:52

#5 楼

对于长距离传输,我对在两侧都运行du -s很满意。如果我真的很着急,甚至watch -n1 du -s

watch定期(这里每1秒)执行一条命令(这里du -s)并全屏显示输出。

评论


感谢您提供watch命令的示例!

–凸轮
2012年9月17日下午4:40

//,聪明!根据linfo.org的说法:“ du(即磁盘使用情况)命令报告目录树​​的大小,包括其所有内容和单个文件的大小。这对于跟踪空间猪(即目录和文件)很有用会在硬盘驱动器(HDD)或其他存储介质上消耗大量或过多的空间。”

– Nathan Basanese
15年7月21日在1:44

我不知道您在进行哪种长途转移?当结果出现在TB和M个文件中时,du慢得要命。

–没人
16年4月30日在10:47

对于我的“长距离传输”,du操作大约需要一个小时才能完成,在此期间rsync的运行速度要慢得多,因为它们正在争夺对磁盘的访问权限。

–阿比·贝克特(Abhi Beckert)
17年2月1日在4:24



#6 楼

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

我想您可以为它编写一个包装器,也可以使用已经找到的任何补丁,但是您必须问自己是否真的值得,您是否真的需要rsync的全面进步?

评论


这是一个包装脚本,它以良好的进度条形式显示了总进度和文件进度:gist.github.com/JohannesBuchner/4d61eb5a42aeaad6ce90

– j13r
2015年10月21日在17:47



您可以使用--info = progress2更改--progress的工作方式,它将向您显示全局进度。您将需要禁用增量递归算法以使其有用,因此--info = progress2 --no-inc-recursive

–垫
16-3-21在10:37



@ j13r,您也可以分享这个要点作为答案!它的绝佳选择!

–skywinder
17年2月18日在13:36

#7 楼

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

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


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


评论


--info = name0是金🌈👑

– ipatch
18年6月21日在17:57

#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 }')

${RSYNC} ${RSYNC_ARGS} ${SOURCES} ${TARGET} | pv -l -e -p -s "$TODO"


#9 楼

如果您没有最新的rsync(例如,OS X具有2.6.9)并且不能使用--info=progress2,则这是另一种方法,可以使自己免受正在进行的滚动文本页面的影响:

rsync -aPh <source> <destination> | xargs -L1 printf "[2K\rTransferring: %s"

将在一行上打印出要传输的最新文件的名称:

Transferring: the-latest.file

#10 楼

我使用了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"


我将TODO干运行更改为

TODO=$(find ${SOURCES} | wc -l)


查找文件数非常快!

评论


找到比rsync --dry-run好得多的作品!

–hopeseekr
2013年1月5日,2:11

只有在本地进行rsync时,find才有效。 rsync --dry-run也可用于远程源...

–voretaq7
13年5月8日在17:29

#11 楼

使用

lsof -ad3-999 -c rsync


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

评论


我想在$(pgrep'rsync')中为我发布此内容;做ls -l / proc / $ i / fd;完成,但是您的解决方案更简单。

– Aalex Gabi
19年8月25日在15:03

#12 楼

我会在此发表评论,但声誉不高。
作为对naught101对所选答案的评论的回应,--progress选项显示了要传输的文件总数中已传输了多少个文件。在看完这篇文章并更仔细地查看输出之前,我才意识到这一点。

“待检查”状态显示了总数中剩下多少文件。 rsync到新的目的地时,这是最常用的,因此您知道所有文件都将被完全复制。

从手册页:

#13 楼

请注意这里的警告,即使--info = progress2也不是完全可靠的,因为这是基于进度显示时rsync“知道”的文件数的百分比。这不一定是需要同步的文件总数(例如,如果它在深度嵌套的目录中发现了大量大文件)。确保--info = progress2在进度指示中不“跳回”的一种方法是强制rsync在开始同步之前以递归方式扫描所有目录(而不是执行增量递归扫描的默认行为),通过提供--no-inc-recursive选项。但是请注意,此选项还会增加rsync内存使用率和运行时间。

评论


可以使用--no-inc-recursive选项或更短的--no-i-r别名来禁用增量递归。 (请参阅其他答案)

– koppor
19年1月13日在8:17

#14 楼

我使用了一个脚本,该脚本从/ proc // io中提取了rsync进程(或与此相关的任何其他进程)的信息,并且知道要转移的总数可以计算进度。

#!/bin/bash

usage()
{
   echo "usage: q4312078q PID BASEMSIZE [DELAY[s|m|h]]"
}

if [ $# -lt 2 ]; then
   usage
   exit 1
elif [ $# -eq 3 ]; then
   DELAY=
else
   DELAY=5s
fi

PID=
PBASE=`echo "scale=2; /1024"|bc`

R_PID=$PID
W_PID=$PID

R_SPEED_MAX=0
W_SPEED_MAX=0
R_SPEED_CUM=0
W_SPEED_CUM=0
R_SPEED_AVG=0
W_SPEED_AVG=0

ETA=0
ETA_H=0
ETA_M=0
ETA_S=0

while [ ! -r /proc/$PID/io ];
do
   clear
   echo "Waiting for process with PID=$PID to appear!"
   sleep 1
done

B_READ_PREV=`cat /proc/$R_PID/io|awk ' ~ /^read_bytes/ {print }'`
B_WRITE_PREV=`cat /proc/$W_PID/io|awk ' ~ /^write_bytes/ {print }'`
T1=`date +%s.%N`

count=0
while true
do
   [ ! -r /proc/$PID/io ] && break
   clear
   B_READ=`cat /proc/$R_PID/io|awk ' ~ /^read_bytes/ {print }'`
   B_WRITE=`cat /proc/$W_PID/io|awk ' ~ /^write_bytes/ {print }'`
   BL_READ=`echo "scale=2; ($B_READ-$B_READ_PREV)/1048576"|bc`
   BL_WRITE=`echo "scale=2; ($B_WRITE-$B_WRITE_PREV)/1048576"|bc`
   GB_DONE=`echo "scale=2; $B_WRITE/1073741824"|bc`
   PDONE=`echo "scale=2; $GB_DONE*100/$PBASE"|bc`
   T2=`date +%s.%N`
   TLOOP=`echo "scale=2; ($T2-$T1)/1"|bc`
   R_SPEED=`echo "scale=2; $BL_READ/$TLOOP"|bc`
   W_SPEED=`echo "scale=2; $BL_WRITE/$TLOOP"|bc`

   if [ $count -ge 1 ]; then
      R_SPEED_CUM=`echo "scale=2; $R_SPEED_CUM+$R_SPEED"|bc`
      R_SPEED_AVG=`echo "scale=2; $R_SPEED_CUM/$count"|bc`
      W_SPEED_CUM=`echo "scale=2; $W_SPEED_CUM+$W_SPEED"|bc`
      W_SPEED_AVG=`echo "scale=2; $W_SPEED_CUM/$count"|bc`
      [ `echo "scale=2; $W_SPEED > $W_SPEED_MAX"|bc` -eq 1 ] && W_SPEED_MAX=$W_SPEED
      [ `echo "scale=2; $R_SPEED > $R_SPEED_MAX"|bc` -eq 1 ] && R_SPEED_MAX=$R_SPEED
   fi

   if [ `echo "scale=2; $W_SPEED_AVG > 0"|bc` -eq 1 ]; then
      ETA=`echo "scale=2; (($PBASE-$GB_DONE)*1024)/$W_SPEED_AVG"|bc`
      ETA_H=`echo "scale=0; $ETA/3600"|bc`
      ETA_M=`echo "scale=0; ($ETA%3600)/60"|bc`
      ETA_S=`echo "scale=0; ($ETA%3600)%60"|bc`
   fi

   echo "Monitoring PID: $PID"
   echo
   echo "Read:       $BL_READ MiB in $TLOOP s"
   echo "Write:      $BL_WRITE MiB in $TLOOP s"
   echo
   echo "Read Rate:  $R_SPEED MiB/s ( Avg: $R_SPEED_AVG, Max: $R_SPEED_MAX )"
   echo "Write Rate: $W_SPEED MiB/s ( Avg: $W_SPEED_AVG, Max: $W_SPEED_MAX )"
   echo
   echo "Done: $GB_DONE GiB / $PBASE GiB ($PDONE %)"
   [ `echo "scale=2; $ETA > 0"|bc` -eq 1 ] && printf "ETA: %02d:%02d:%05.2f (%.2fs)\n" $ETA_H $ETA_M $ETA_S $ETA
   echo "Elapsed: `ps -p $PID -o etime=`"

   T1=`date +%s.%N`
   sleep $DELAY
   B_READ_PREV=$B_READ
   B_WRITE_PREV=$B_WRITE
   ((count++))
done
echo "----- Finished -------------------------------------------------------------------"


#15 楼

如果您的rsync版本不接受--info=progress2选项,则可以使用tqdm

要安装:

pip install tqdm


要使用:

$ rsync -av /source /dest | tqdm --unit_scale | wc -l
10.0Mit [00:02, 3.58Mit/s]


#16 楼

也许您可以将pv与rsync结合使用。特别是参数--size可能会有所帮助。看一下文档,像pv --size $(du -sb . | awk '{print }') | rsync -av . host:/your/path这样的东西应该可以工作。

在这里您将找到文档和软件。

我自己没有尝试过。
/>

#17 楼

在这里可能会有点晚,但是将来的求职者可能会受益。

这也困扰着我,所以我以为自己会变得肮脏而写我的第一个脚本。必须安装zenity软件包(sudo apt-get install zenity),但我确定它可能已经存在。另外,我使用wmctrl(窗口管理器控件)在完成时更改进度对话框的标题,它易于安装,但如果没有的话,不会有所作为。我只想在面板中看到它完成的时间。

注意:这仅适用于完整的目录/文件同步(我通常使用它来备份apt缓存),因此没有--exclude = / file / in / Source-directory选项。 />如果目标目录中没有源目录中的文件/目录,也不会起作用。测试资源。

PS。该脚本可能写得很差或效率很低(此处为纯脚本),但至少可以达到目的,当然,欢迎您对其进行编辑和改进以适应您的需求。
PSS。另外,无法获得取消按钮来杀死rsync,因此我将其删除。

    #!/bin/bash
set -e;

WELC="Running RsyncP as $USER";

function echo_progress()
{
    while (($TRANSFER_SIZE > 1000));    
    do  
        DEST_SIZE=$(du -s $DEST_FOLDER | cut -d / -f 1); 
        ((TRANSFER_SIZE=$SOURCE_SIZE-DEST_SIZE)); 
        PROGRESS_PERC=$((DEST_SIZE*100/SOURCE_SIZE));
        echo $PROGRESS_PERC;
        sleep 0.1s;
    done;
    echo 100;
    zenity --info --width=250 --title=RsyncP --text="File syncing complete!";
}

function get_input()
{
    dirs=$(zenity --forms --width=500 --title="RsyncP" --text="Enter source And destination directories" --add-entry="Source: " --add-entry="Destination: " --separator=" ");

    SOURCE_FOLDER=$(echo $dirs | cut -d' ' -f 1);
    DEST_FOLDER=$(echo $dirs | cut -d' ' -f 2);

    OPTIONS=-$(zenity --list --title="RsyncP Options" --text="Select rsync options" --separator='' --height=470 --width=470 --checklist --column "activate" --column "Option" --column "Description" FALSE v "Verbose (Terminal only)" FALSE q "Quiet, supress non-error messages (Terminal only)" FALSE P "Progress (Terminal only)" FALSE a "Archive (lrpog)" TRUE r "Recurse into directories" FALSE p "Preserve permissions" FALSE o "Preserve owner" FALSE g "Preserve group" FALSE l "Copy symlinks as symlinks");

    zenity --question --no-wrap --title="RsyncP" --width=500 --text="rsync  $OPTIONS $SOURCE_FOLDER $DEST_FOLDER\nDo you want to continue?";

    SOURCE_SIZE=$(du -s $SOURCE_FOLDER | cut -d / -f 1); 
    DEST_SIZE=$(du -s $DEST_FOLDER | cut -d / -f 1); 
    PROGRESS_PERC=$((DEST_SIZE*100/SOURCE_SIZE)); 
    TRANSFER_SIZE=1001;
}

if [ "$(id -u)" != "0" ]; then
    zenity --question --title=RsyncP --text="$WELC, Continue?";
    get_input;
    rsync  $OPTIONS $SOURCE_FOLDER $DEST_FOLDER & 
    echo_progress | zenity --progress --title=RsyncP --no-cancel --auto-close --text="Copying from \n$SOURCE_FOLDER to \n$DEST_FOLDER" ;

else            
    zenity --question --title=RsyncP --text="$WELC, Continue?";
    get_input; 
    sudo rsync  $OPTIONS $SOURCE_FOLDER $DEST_FOLDER & 
    echo_progress | zenity --progress --title=RsyncP --no-cancel --auto-close --text="Copying from \n$SOURCE_FOLDER to \n$DEST_FOLDER" ;
fi


评论


看看YAD。这是Zenity的一个叉子(重写?),就像Zenity ...但在类固醇上。我的脚本将它用于回退到Zenity的所有事情,因为我有一台只有Zenity的机器。命令选项足够类似,但是您只是失去了Zenity的许多优点。

– DocSalvager
18 Mar 10 '18 at 16:26

#18 楼

我在包装器中为rsync制作了一个进度条。使用新版rsync中的--info=progress2,无需修补。
用法-将rsync替换为rsyncy
rsyncy -a FROM/ TO


在GitHub上的更多信息,请与pip3 install --user rsyncy安装