4

从rclone配置中自动提取主/从路径进行一对多备份(主/从标识模式)

 2 years ago
source link: https://www.luoji.men/?p=2114
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

从rclone配置中自动提取主/从路径进行一对多备份(主/从标识模式)

2020年11月22日2020年11月22日 上张贴 由 huzongsi从rclone配置中自动提取主/从路径进行一对多备份(主/从标识模式)已关闭评论

原理:自动从rclone.conf配置中提取含有”MASTER”(主盘)和”SLAVE”(从盘)字符的配置名称列表,
配置名称格式参考

[root@www tmp]# rclone config
Name Type
==== ====
MASTER-uteam  #主盘
SLAVE-ccteam  #从盘1
SLAVE-lateam  #从盘2
[root@www tmp]#

然后循环执行 gclone sync 或者 rclone sync 命令(根据你使用的rclone客户端)

gclone sync '$主盘': '$从盘': --drive-server-side-across-configs -v --stats 5s --drive-chunk-size 32M
  • 需要安装Tmux
  • 只能存在一个主盘
  • 可以存在多个从盘(一个主盘同步到多个从盘)
  • 本脚本包含rclone的 sync同步 和 dedupe去重 两个指令.
  1. 创建含有”MASTER”和”SLAVE”字符串的谷歌盘配置名
  2. 新建shell脚本rclone-sync-slave.sh,复制下方完整代码
  3. 执行bash rclone-sync-slave.sh
  • 以下是完整脚本,新建rclone-sync-slave.sh
#[2020-11-22 23:04]正式版本
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH

#cfg_path="/root/.config/rclone/rclone.conf" #命令结果赋值给变量
cfg_cmd=$(rclone config file) #rclone查询配置文件路径,命令结果含有非路径字符需要截取
cfg_path=${cfg_cmd#*:} #使用 # 号截取 : 右边字符,*号表示忽略:的左边
echo $cfg_path
#grep -c 'MASTER' /root/.config/rclone/rclone.conf #统计MASTER主盘个数,超过1个就报错不再执行
#if [ $(grep -c 'MASTER' $cfg_path) == 1 ]; then echo yes; else echo "MASTER不等于1,退出脚本";exit; fi #普通正则语法
if [ $(grep -Pc '(?<=\[).*MASTER.*(?=\])' $cfg_path) == 1 ]; then echo yes; else echo "统计到MASTER配置名不等于1个,退出脚本";exit; fi #P正则语法
echo "有且只有1个MASTER配置名,继续执行..."

#grep -Po '(?<=\[).*(?=\])' /root/.config/rclone/rclone.conf #通过[*]匹配提取配置文件中的每个配置名称
grep -Po '(?<=\[).*MASTER.*(?=\])' /root/.config/rclone/rclone.conf #查看[*]匹配提取配置中的每个MASTER名称
grep -Po '(?<=\[).*SLAVE.*(?=\])' /root/.config/rclone/rclone.conf #查看[*]匹配提取配置中的每个SLAVE名称
src=$(grep -Po '(?<=\[).*MASTER.*(?=\])' $cfg_path) #通过[*]匹配提取文件中的包含MASTER的字符行.赋值为源路径
dst=$(grep -Po '(?<=\[).*SLAVE.*(?=\])' $cfg_path)" "$src #通过[*]匹配文件中的包含SLAVE的字符行.并拼接进src用空格隔开src元素给for循环使用
echo $dst
for dst_line in $dst
do
 echo 循环读取: $dst_line
 session="sync-"$dst_line #tmux进程名
 tmux new-session -s $session -d #新建tmux进程
    if [[ $dst_line == *SLAVE* ]] #如果包含SLAVE字符则执行sync,否则跳过直接执行去重
     then echo "包含SLAVE,判断为从目录,执行主目录sync到从目录"; 
        tmux send-keys -t $session 'gclone sync '$src': '$dst_line': --drive-server-side-across-configs -v --stats 5s --drive-chunk-size 32M' C-m #源主目录sync到目的从目录
     else echo "不包含SLAVE,判断为主目录,不执行sync命令";
    fi
 tmux send-keys -t $session 'gclone dedupe '$dst_line': --disable ListR' C-m #去重
done

#quit
#tmux send-keys -t $session 'exit' C-m

endDate=`date +"%Y-%m-%d %H:%M:%S"` ; echo "[$endDate] Successful"
echo "----------------------------------------------------------------------------"

张贴在Linux网站运维


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK