2019年10月

#!/bin/sh
#

src='rsync://your.anrip.com:873' #源路径
dst='/mnt/backup' #目标路径
dir='project' #待同步的项目

opt="-rltPv --delete" #同步选项

num=32 #进程数
depth='4 3 2 1' #归递目录深度

skip=/tmp/`echo $src$dir | md5sum | head -c 16`.skip
[ -f $skip-next ] && cp $skip-next $skip
[ -f $skip ] || touch $skip

# 创建目标目录结构
rsync $opt --include "*/" --exclude "*" $src/$dir/ $dst/$dir

# 进入本地索引目录
cd $dst

# 从深到浅同步目录
for l in $depth ;do
    # 启动rsync进程
    for i in `find $dir -maxdepth $l -mindepth $l -type d`; do
        if `grep -q "$i$" $skip`; then
            echo "skip $i"
            continue
        fi
        while true; do
            now_num=`ps axw | grep rsync | grep $dir | grep -v '\-\-daemon' | wc -l`
            if [ $now_num -lt $num ]; then
                rsync $opt $src/$i/ $dst/$i &
                echo $i >>$skip-next
                sleep 1
                break
            else
                sleep 5
            fi
        done
    done
done

# 最终单进程验证
while true; do
    sleep 5
    now_num=`ps axw | grep rsync | grep $dir | grep -v '\-\-daemon' | wc -l`
    if [ $now_num -lt 1 ]; then
        rsync $opt $src/$dir/ $dst/$dir
        break
    fi
done