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
# 1. 下载脚本到系统路径
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

# 2. 验证安装
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

# 每天凌晨2点同步网站数据(目录模式)
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 # 保留4个备份
maxage 15 # 最大保存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
# rsync 返回代码含义
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

# 临时修改脚本添加调试信息
# 在脚本开头添加:set -x

# 检查环境变量
env | grep -i rsync
echo $PATH
which rsync

性能问题排查

1
2
3
4
5
6
7
8
9
10
11
# 检查磁盘IO
iostat -x 1

# 监控网络带宽
iftop -i eth0

# 检查系统负载
top -p $(pgrep rsync)

# 分析大文件
find /source -type f -size +100M -exec ls -lh {} \;

🎯 总结与技巧

最佳实践建议

  1. 测试先行:首次使用添加 --dry-run 参数预览
  2. 循序渐进:先单目标测试,再扩展多目标
  3. 监控资源:大文件同步时监控系统负载
  4. 备份配置:重要同步任务保存为脚本文件

高级使用技巧

1
2
3
4
5
6
7
8
9
10
11
12
13
# 批量同步脚本模板
#!/bin/bash
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,🛣️ 路径自然写,🔧 脚本智能补!

脚本持续维护中,欢迎反馈使用体验和功能建议!