将两个rsync脚本合并为支持日期模式参数的单脚本
合并rsync同步脚本实现多模式数据同步
需求回顾
- Server1的
BASE/目录下存在YYYYMMDD格式的日文件夹,每日生成当日文件夹并持续写入文件 - Server2原本运行两个独立进程:
- 每5分钟同步Server1过去2天的数据
- 每日同步Server1当年所有目录(用
$(date "%Y*")匹配)
- 目标:合并为单个脚本,通过传入rsync可直接识别的日期模式参数实现两种需求,无需分支标志控制
实现方案
编写一个接收位置参数的脚本,将参数直接传递给rsync作为源路径匹配模式,让脚本成为rsync同步的"参数转发器",同时保留必要的同步配置。
合并后的脚本示例
#!/bin/bash # 同步Server1指定模式的目录到Server2本地 # 使用示例: # 1. 同步过去2天数据: ./sync_script.sh "$(date -d '2 days ago' +%Y%m%d)" "$(date +%Y%m%d)" # 2. 同步当年所有目录: ./sync_script.sh "$(date +%Y)*" # 配置参数 REMOTE_SERVER="server1" REMOTE_BASE="/path/to/BASE" LOCAL_BASE="/path/to/local/BASE" RSYNC_OPTS="-avz --delete-delay --exclude='.*'" # 根据实际需求调整rsync选项 # 检查是否传入模式参数 if [ $# -eq 0 ]; then echo "错误: 请传入rsync可识别的日期模式参数" echo "示例: ./sync_script.sh 2024* 或 ./sync_script.sh 20240520 20240521" exit 1 fi # 执行同步:将传入的所有参数作为远程路径的匹配模式 rsync $RSYNC_OPTS "${REMOTE_SERVER}:${REMOTE_BASE}/{"$*"}" "${LOCAL_BASE}/"
脚本说明
- 参数传递逻辑:脚本接收的所有位置参数会被拼接成rsync的源路径匹配模式(用大括号语法批量匹配),完全符合rsync的路径匹配规则
- 两种需求的调用方式:
- 同步过去2天:通过
date命令生成两天的日期字符串作为参数传入,rsync会精准匹配这两个日文件夹 - 同步当年所有目录:传入
$(date +%Y)*作为参数,rsync会匹配所有以当年年份开头的文件夹
- 同步过去2天:通过
- rsync选项配置:
-avz实现归档、详情输出、压缩传输;--delete-delay确保先完成同步再删除本地多余文件,避免日内写入文件时的冲突;--exclude='.*'排除隐藏文件(可根据实际场景调整)
定时任务配置(Server2上)
用crontab -e添加以下定时任务,替代原来的两个进程:
- 每5分钟同步过去2天数据:
*/5 * * * * /path/to/sync_script.sh "$(date -d '2 days ago' +%Y%m%d)" "$(date +%Y%m%d)" >> /var/log/sync_recent.log 2>&1 - 每日凌晨同步当年所有目录:
0 0 * * * /path/to/sync_script.sh "$(date +%Y)*" >> /var/log/sync_yearly.log 2>&1
优势
- 完全避免分支逻辑,脚本逻辑极简,仅做参数转发和基础配置
- 扩展性强:后续需要同步任意日期范围,只需传入对应的rsync匹配模式即可,无需修改脚本
- 保留rsync原生匹配能力,无需额外编写日期解析逻辑
内容的提问来源于stack exchange,提问作者Grigor Aleksanyan
相关产品推荐
相关产品推荐

