我已经search了这个选项,但只find涉及自定义修补的解决scheme。 事实上,它不显示在帮助和没有更多的信息可能会发现可能表明答案是“否”,但我希望看到这个证实。
是否有可能显示与rsync的总文件传输进度 ?
danakim是正确的。 添加总进度指标并不是一件简单的事情。
原因是当rsync查看要同步的文件列表时,它不会提前知道哪些文件需要更改。 如果你正在进行三angular洲转移,三angular洲本身必须提前计算,以便提供需要完成的工作的总体情况。
换句话说,计算需要完成多less工作的最简单方法就是实际执行。
现在有一个正式的方法来做到这一点在rsync(版本3.1.0协议版本31,testing与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
文件夹,因为我想要这个function来传输整个文件系统,而/usr
似乎是一个很好的代表性示例。
--info=progress2
给出了一个很好的总体百分比,即使它只是一个部分值。 实际上,我的/usr
文件夹超过了6个演出:
#> du -sh /usr 6,6G /usr/
和rsync
花了很多时间来扫描一切。 所以几乎所有的时候,我看到的百分比大约90%完成了,但是看到某些东西被复制,这是令人欣慰的:)
参考文献:
你可以用'pv'( apt-get install pv
与Debian和ubuntu)。 我build议监视传输的文件数,因为传输的数据量与文件大小无关,而与源和目的地之间的增量相关。 计数文件将计算一个大三angular洲和另一个小三angular洲相同的进展。 这意味着在任何情况下,ETA估算可能都很遥远。 如果您的目的地为空,在这种情况下,delta ==大小的来源,基于大小的ETA才有效。
总的想法是每个文件从rsync发送一个“传输”行,并用“pv”对这些行进行计数:
rsync -ai / source remote:/ dest | pv -les [文件数量]> / dev / null
我倾向于备份整个文件系统(出于几个原因),在这种情况下,您可以使用便宜得多的df
来获取文件的数量(而不是du
或者在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上可能会很慢并且很重)。
对于长时间的转账,我很高兴能在双方运行du -s
。 如果我感到非常焦虑的话,即使watch -n1 du -s
。
watch
周期性执行一个命令(在这里每隔1秒钟)并显示全屏输出。
随着–info = progress2你也可以禁用增量recursion。 这将在开始时build立整个文件列表,从而给你一个更好的想法总体进展(至less在文件数量,我不认为它扫描文件大小)。 有一个权衡。 这是更昂贵的内存,并延迟实际转移的开始。 可能最好用于慢速链接连接,对于大量的文件来说肯定不是很好。
以下是来自rsync手册页的-r –recursive的详细信息
增量recursion可以使用–no-inc-recursive选项或者更短的–no-ir别名来禁用。
(来源: http : //rsync.samba.org/ftp/rsync/rsync.html )
另外,如果你指定–delete,它将在开始时强制执行完整recursion,这是为了删除孤立文件(dest中存在但不存在于source中的文件)所需要的。
基本上没有。 您只能使用–progress标志显示每个文件的进度,但这是关于它的。
我猜你可以写一个封装,或使用你已经find的任何补丁,但你必须问自己是否真的值得,你真的需要一个rsync的全面进展?
我也search了如何显示rsync的总体进展,并从这篇文章中发现了一个有用的答案: https ://stackoverflow.com/questions/7157973/monitoring-rsync-progress
基本上,您可以在开发版本的rsync 3.1.0中使用–info = progress2 。 以下是医生所说的话:
还有一个–info = progress2选项,用于输出基于整个传输的统计信息,而不是单个文件。 在不输出文件名的情况下使用这个标志(例如,避免使用-v或者指定–info = name0,如果你想知道如何在没有滚动屏幕的情况下使用大量的名字进行传输(你不需要指定 – 进度选项,以便使用–info = progress2。)
我使用了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"
我使用了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)
它发现文件的数量非常快!
使用
lsof -ad3-999 -c rsync
要查看rsync当前打开的文件(将显示文件大小)rsync副本到本地隐藏的文件
如果您没有最新的rsync(例如,OS X 2.6.9),并且无法使用--info=progress2
,则可以使用另一种方法来保存正在进行的滚动文本页面:
rsync -aPh <source> <destination> | xargs -L1 printf "\33[2K\rTransferring: %s"
这将在一行中打印正在传输的最新文件的名称:
Transferring: the-latest.file
我会做这个评论,但没有足够的声誉。 为了回应naught101对所选答案的评论,–progress选项显示有多less文件已经被转移出总转移量。 直到看这篇文章,我才意识到这一点,并仔细查看输出。
“检查”统计显示总共有多less文件不存在。 这是最常用的rsync到一个新的目的地,所以你知道所有的文件将被完全复制。
从手册页:
When [each] file transfer finishes, rsync replaces the progress line with a summary line that looks like this: 1238099 100% 146.38kB/s 0:00:08 (xfer#5, to-check=169/396) In this example, the file was 1238099 bytes long in total, the average rate of transfer for the whole file was 146.38 kilobytes per second over the 8 seconds that it took to complete, it was the 5th transfer of a regu- lar file during the current rsync session, and there are 169 more files for the receiver to check (to see if they are up-to-date or not) remaining out of the 396 total files in the file-list.
我使用脚本从/ proc // io中提取rsync进程(或其他任何进程)的信息,并知道要传输的总量是计算进度。
#!/bin/bash usage() { echo "usage: $0 PID BASEMSIZE [DELAY[s|m|h]]" } if [ $# -lt 2 ]; then usage exit 1 elif [ $# -eq 3 ]; then DELAY=$3 else DELAY=5s fi PID=$1 PBASE=`echo "scale=2; $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 '$1 ~ /^read_bytes/ {print $2}'` B_WRITE_PREV=`cat /proc/$W_PID/io|awk '$1 ~ /^write_bytes/ {print $2}'` T1=`date +%s.%N` count=0 while true do [ ! -r /proc/$PID/io ] && break clear B_READ=`cat /proc/$R_PID/io|awk '$1 ~ /^read_bytes/ {print $2}'` B_WRITE=`cat /proc/$W_PID/io|awk '$1 ~ /^write_bytes/ {print $2}'` 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 -------------------------------------------------------------------"
也许你可以把pv
与rsync结合起来。 特别是参数 – --size
可以有所帮助。 看看文档,像pv --size $(du -sb . | awk '{print $1}') | rsync -av . host:/your/path
pv --size $(du -sb . | awk '{print $1}') | rsync -av . host:/your/path
pv --size $(du -sb . | awk '{print $1}') | rsync -av . host:/your/path
应该工作。
在这里您可以find文档和软件。
没有尝试过我自己的。
请注意这里的警告即使–info = progress2也不是完全可靠的,因为这是百分比是基于rsync“知道”在显示进度时的文件数量。 这不一定是需要同步的文件总数(例如,如果在深度嵌套的目录中发现大量大文件)。 确保–info = progress2不会在进度指示中“跳回”的一种方法是强制rsync在开始同步之前recursion扫描所有目录(而不是执行增量recursion扫描的默认行为),通过还提供–no-increcursion选项。 但请注意,此选项也会增加rsync内存使用情况和运行时间。
如果您的rsync
版本不接受--info=progress2
选项,则可以使用tqdm
:
安装:
pip install tqdm
使用:
$ rsync -av / source / dest | tqdm --unit_scale | wc -l 10.0Mit [00:02,3.58Mit / s]
在这里可能会有点晚,但未来的回答者可能会受益。
这也是在烦我,所以我想我会沮丧的写下我的第一个剧本。 包zenity必须安装(sudo apt-get install zenity),但我相信它可能已经在那里了。 另外,我使用wmctrl(窗口pipe理器控件)在完成时更改进度对话框的标题,它很容易安装,但如果不这样做,则不会有所作为。 我只是想看看我的面板什么时候完成。
该脚本基本上要求源和目标目录,使用du计算大小上的目标的百分比,并显示一个进度条。
注意:这只适用于完整的目录/文件同步(我通常用它来制作apt cache的备份),所以没有–exclude = / file / in / Source-directory选项。 如果Destination目录中的文件/目录不在源目录中,也不起作用。 我不知道它是否适用于远程源/目的地,因为从来没有我需要它或资源来testing它。
PS。 这个脚本可能写得非常糟糕,或者效率很低(这里是脚本处女),但至less可以达到目的,当然欢迎编辑和改进以满足您的需求。 PSS。 此外,不能得到取消button来杀死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