You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将两个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}/"

脚本说明

  1. 参数传递逻辑:脚本接收的所有位置参数会被拼接成rsync的源路径匹配模式(用大括号语法批量匹配),完全符合rsync的路径匹配规则
  2. 两种需求的调用方式:
    • 同步过去2天:通过date命令生成两天的日期字符串作为参数传入,rsync会精准匹配这两个日文件夹
    • 同步当年所有目录:传入$(date +%Y)*作为参数,rsync会匹配所有以当年年份开头的文件夹
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 07:21:35