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 {} \;
|
🎯 总结与技巧
最佳实践建议
- 测试先行:首次使用添加
--dry-run
参数预览
- 循序渐进:先单目标测试,再扩展多目标
- 监控资源:大文件同步时监控系统负载
- 备份配置:重要同步任务保存为脚本文件
高级使用技巧
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
,🛣️ 路径自然写,🔧 脚本智能补!
脚本持续维护中,欢迎反馈使用体验和功能建议!