Rsync 一键多目标增量同步脚本 🔁
支持文件→多文件、目录→多目录双模式,彩色终端、实时进度、自动日志轮转、耗时统计,一条命令解决所有本地同步场景。
📋 导航目录
🌟 核心特性
🎯 双模式智能识别
- 目录模式:自动添加尾随斜杠,使用
--delete
保持一致性
- 文件模式:精确同步单个文件,自动创建目标目录结构
🔧 自动化运维
- 依赖自检:自动检测并安装 rsync 软件包
- 目录自建:目标路径不存在时自动
mkdir -p
- 日志轮转:内置 15 天压缩轮转策略
📊 实时监控反馈
- 彩色进度:终端实时显示传输进度
- 完成度估算:目录同步后计算空间占比
- 耗时统计:精确到秒的任务执行时间
🛡️ 错误处理机制
- 严格模式:
set -euo pipefail
确保脚本健壮性
- 状态检查:每个同步目标独立验证
- 错误隔离:单目标失败不影响其他任务
⚙️ 脚本架构解析
1 2
| 1. 参数解析 → 2. 环境检查 → 3. 依赖安装 → 4. 同步执行 → 5. 结果统计
|
核心函数说明:
log()
: 双通道日志(终端彩色 + 文件纯文本)
sync_and_check()
: 核心同步逻辑,区分文件/目录模式
- 自动路径处理:智能处理尾随斜杠问题
📦 安装与依赖
快速安装
1 2 3 4 5 6
| sudo curl -o /usr/local/bin/rsync.sh https://raw.githubusercontent.com/your-repo/rsync.sh/main/rsync.sh sudo chmod 755 /usr/local/bin/rsync.sh
rsync.sh --version
|
🚀 使用指南
📁 目录同步模式
使用示例:
1
| bash <(curl -sL gitee.com/meimolihan/script/raw/master/sh/sync/rsync.sh) /源目录 /目标目录1 /目标目录2
|
关键参数说明:
-a
: 归档模式(保留权限、时间戳等)
-v
: 详细输出
-h
: 人类可读格式
-z
: 压缩传输
-p
: 保留权限
--delete
: 删除目标中源不存在的文件
📄 文件同步模式
使用示例:
1
| bash <(curl -sL gitee.com/meimolihan/script/raw/master/sh/sync/rsync.sh) -f /源文件 /目标文件1 /目标文件2
|
与目录模式差异:
- 不使用
--delete
选项
- 不添加尾随斜杠
- 不计算完成度百分比
🔍 脚本功能详解
颜色编码系统
1 2 3 4 5 6 7
| RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' PURPLE='\033[0;35m' CYAN='\033[0;36m' WHITE='\033[1;37m'
|
完成度计算逻辑
1 2 3 4 5 6
| src_size=$(du -sb "$source_path" | awk '{print $1}') tgt_size=$(du -sb "$tgt" | awk '{print $1}')
comp=$(awk -v s=$src_size -v t=$tgt_size 'BEGIN{printf "%.2f",(t/s)*100}')
|
智能路径处理
1 2 3 4 5 6 7 8
| source_path="${1%/}"
rsync -avhzp --progress --delete "$source_path/" "$tgt/"
rsync -avh --progress "$source_path" "$tgt"
|
🕐 自动化示例(cron)
生产环境部署示例
1 2 3 4 5 6 7 8 9 10 11
| sudo crontab -e
0 2 * * * bash <(curl -sL gitee.com/meimolihan/script/raw/master/sh/sync/rsync.sh) /var/www/html /backup/www_daily >> /var/log/rsync/www.log 2>&1
0 * * * * bash <(curl -sL gitee.com/meimolihan/script/raw/master/sh/sync/rsync.sh) -f /etc/nginx/nginx.conf /backup/nginx/nginx.conf.$(date +\%H)
0 3 * * 0 bash <(curl -sL gitee.com/meimolihan/script/raw/master/sh/sync/rsync.sh) /important_data /nas/backup /external_drive/backup --exclude='temp/'
|
🔧 常用选项组合
性能优化组合
1 2 3 4 5 6 7 8 9 10 11 12
| rsync.sh /large_files /target1 /target2 \ --partial \ --progress \ --bwlimit=100m \ --timeout=300
rsync.sh /many_small_files /target1 /target2 \ -W \ --inplace \ --no-compress
|
安全同步组合
1 2 3 4 5 6 7 8 9 10 11 12
| bash <(curl -sL gitee.com/meimolihan/script/raw/master/sh/sync/rsync.sh) /critical_data /backup1 /backup2 \ --checksum \ --ignore-times \ --backup \ --backup-dir=/backups/old
bash <(curl -sL gitee.com/meimolihan/script/raw/master/sh/sync/rsync.sh) /sensitive_data /remote_backup \ -e "ssh -p 2222 -i /path/to/key" \ --compress \ --timeout=60
|
🗂️ 日志系统详解
日志格式规范
1 2 3 4
| [2025-09-26 14:30:25] INFO: 检查源目录是否存在... [2025-09-26 14:30:25] SUCCESS: ✓ 源目录存在:/home/data [2025-09-26 14:30:26] INFO: 检查 rsync 是否安装... [2025-09-26 14:30:26] SUCCESS: ✓ rsync 已就绪
|
轮转配置详情
1 2 3 4 5 6 7 8 9 10 11
| /var/log/rsync/*.log { daily rotate 4 maxage 15 compress delaycompress missingok notifempty copytruncate }
|
日志分析技巧
1 2 3 4 5 6 7 8 9 10 11
| grep "完成度约" /var/log/rsync/rsync.log
grep "总用时" /var/log/rsync/rsync.log
grep -i "失败\|error\|failed" /var/log/rsync/rsync.log
sed -n '/2025-09-26 10:00:00/,/2025-09-26 11:00:00/p' /var/log/rsync/rsync.log
|
⚠️ 故障排查指南
常见错误代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| 0: 成功 1: 语法或使用错误 2: 协议不兼容 3: 文件选择错误 4: 不支持的操作 5: 协议启动失败 6: 守护进程操作失败 10: socket I/O 错误 11: 文件 I/O 错误 12: 协议数据流错误 13: 权限错误 14: 检查和不匹配 20: 收到 SIGUSR1 或 SIGINT 21: 等待子进程时出现错误 22: 错误分配内存 23: 部分传输 24: 文件未完全传输 25: 传输提前结束
|
调试模式启用
1 2 3 4 5 6 7 8 9 10
| bash -x /usr/local/bin/rsync.sh /source /target1
env | grep -i rsync echo $PATH which rsync
|
性能问题排查
1 2 3 4 5 6 7 8 9 10 11
| iostat -x 1
iftop -i eth0
top -p $(pgrep rsync)
find /source -type f -size +100M -exec ls -lh {} \;
|
🎯 总结与技巧
最佳实践建议
- 测试先行:首次使用添加
--dry-run
参数预览
- 循序渐进:先单目标测试,再扩展多目标
- 监控资源:大文件同步时监控系统负载
- 备份配置:重要同步任务保存为脚本文件
高级使用技巧
1 2 3 4 5 6 7 8 9 10 11 12 13
|
SOURCE_DIRS=("/data/www" "/data/db" "/data/logs") TARGETS=("/backup/primary" "/backup/secondary")
for source in "${SOURCE_DIRS[@]}"; do rsync.sh "$source" "${TARGETS[@]}" --exclude='tmp/' --bwlimit=50m done
if [[ $(find /data -mmin -60 | wc -l) -gt 0 ]]; then rsync.sh /data /backup/data fi
|
版本更新记录
- v1.2 (2025-09-26): 新增文件模式(
-f
),增强错误处理
- v1.1: 增加进度显示,完善日志轮转
- v1.0: 基础目录同步功能
💫 结语
rsync.sh v1.2
通过精心设计的架构和丰富的功能特性,为系统管理员和开发人员提供了高效可靠的文件同步解决方案。无论是简单的日常备份还是复杂的多目标部署,这个工具都能显著提升工作效率。
记住核心原则:📁 目录去 -f
,📄 文件加 -f
,🛣️ 路径自然写,🔧 脚本智能补!
脚本持续维护中,欢迎反馈使用体验和功能建议!