Linux 文件同步 rsync 命令详解 🔄

🚀 掌握高效可靠的文件同步工具,轻松实现本地与远程数据备份和同步
📋 目录导航
✨ rsync 简介
rsync
(remote sync) 是 Linux 系统中功能强大的文件同步工具,以其智能增量传输算法著称,能够高效地在本地或远程系统间同步文件和目录。
🎯 设计理念:只传输变化的部分,最大化节省带宽和时间!
🌟 主要优势:
- ✅ 高效增量传输,节省带宽和时间
- ✅ 支持本地和远程文件同步
- ✅ 保持文件属性(权限、时间戳等)
- ✅ 支持压缩传输和加密连接
- ✅ 灵活的过滤和排除规则
⚡ 核心特性
特性 |
图标 |
说明 |
增量同步 |
🔄 |
只传输有变动的文件部分 |
带宽优化 |
📉 |
支持压缩传输,节省带宽 |
跨平台 |
🌐 |
支持本地和远程同步 |
属性保持 |
📋 |
保留文件权限、时间戳等属性 |
安全传输 |
🔒 |
通过 SSH 加密传输 |
断点续传 |
⏯️ |
支持中断后继续传输 |
灵活排除 |
🚫 |
支持模式排除特定文件 |
🔧 安装与验证
🐧 各发行版安装方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| sudo apt-get install -y rsync
sudo yum install rsync
sudo pacman -S rsync
sudo dnf install rsync
sudo zypper install rsync
sudo apk add rsync
|
✅ 验证安装
1 2 3 4 5 6
| rsync --version
rsync --help man rsync
|
📝 注意:同步的双方都必须安装 rsync 才能正常工作!
🎯 基本语法与参数
📝 基本语法格式
📊 常用参数详解
参数 |
图标 |
说明 |
示例 |
-a, --archive |
🗃️ |
归档模式(保留所有属性) |
rsync -a source/ dest/ |
-v, --verbose |
📢 |
显示详细传输信息 |
rsync -av source/ dest/ |
-z, --compress |
📦 |
压缩传输数据 |
rsync -az source/ dest/ |
-r, --recursive |
📁 |
递归同步目录 |
rsync -r source/ dest/ |
-u, --update |
🔄 |
仅同步更新的文件 |
rsync -au source/ dest/ |
--delete |
🗑️ |
删除目标端多余文件 |
rsync -a --delete source/ dest/ |
--progress |
📊 |
显示传输进度 |
rsync -a --progress source/ dest/ |
-n, --dry-run |
🔍 |
试运行(不实际传输) |
rsync -an source/ dest/ |
-P |
⏯️ |
断点续传+显示进度 |
rsync -aP source/ dest/ |
-h, --human-readable |
👀 |
人类可读格式显示大小 |
rsync -ah source/ dest/ |
--stats |
📈 |
显示传输统计信息 |
rsync -a --stats source/ dest/ |
💾 本地同步场景
📂 目录同步技巧
1 2 3 4 5 6 7 8
| rsync -av /path/to/source/ /path/to/destination/
rsync -av /path/to/source /path/to/destination
rsync -avn source/ destination/
|
💡 重要区别:源目录后的斜杠/
决定是同步目录内容还是目录本身!
🚫 排除特定文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| rsync -av --exclude='*.tmp' source/ destination/
rsync -av --exclude={'*.tmp','.git'} source/ destination/
rsync -av --exclude-from='exclude-list.txt' source/ destination/
rsync -av --exclude='.*' source/ destination/
rsync -av --exclude='*' --include='*.txt' source/ destination/
|
📋 同步示例
1 2 3 4 5 6 7 8 9 10 11
| rsync -avhz --progress /home/user/ /mnt/backup/home/
rsync -av --delete /var/www/ /backup/www/
rsync -av --exclude='Thumbs.db' --exclude='.DS_Store' Photos/ Backup/Photos/
rsync -av --delete --link-dest=/previous/backup /source/ /new/backup/
|
🌐 远程同步技巧
🔗 SSH 远程同步
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| rsync -avz /local/path/ user@remote_host:/remote/path/
rsync -avz user@remote_host:/remote/path/ /local/path/
rsync -avz -e 'ssh -p 2222' /local/path/ user@remote_host:/remote/path/
rsync -avz -e 'ssh -i ~/.ssh/id_rsa' /local/path/ user@remote_host:/remote/path/
rsync -avz /local/path/ remote-host:/remote/path/
|
🌍 远程服务器示例
1 2 3 4 5 6 7 8 9 10 11
| rsync -avz --progress /important/data/ user@backup-server:/backups/data/
rsync -avz --delete root@web-server:/var/www/ /local/backup/www/
rsync -avz /var/log/ user@log-server:/central-logs/$(hostname)/
rsync -av source/ remote-host::module/destination/
|
🚀 高级使用技巧
⏰ 定时同步任务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
crontab -e
0 2 * * * /usr/bin/rsync -av /source/ /destination/ >> /var/log/rsync.log 2>&1
0 * * * * /usr/bin/rsync -av /source/ /destination/
0 0 * * 0 /usr/bin/rsync -av /source/ /destination/
*/5 * * * * /usr/bin/rsync -av /source/ /destination/
|
📝 同步脚本示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| #!/bin/bash
LOG_FILE="/var/log/rsync-backup.log" SOURCE_DIR="/important/data/" DEST_DIR="/backup/data/" MAX_RETRIES=3 RETRY_DELAY=60
echo "==========================================" >> $LOG_FILE echo "$(date): Starting backup from $SOURCE_DIR to $DEST_DIR" >> $LOG_FILE
for ((i=1; i<=$MAX_RETRIES; i++)); do echo "$(date): Attempt $i of $MAX_RETRIES" >> $LOG_FILE rsync -av --delete --stats $SOURCE_DIR $DEST_DIR >> $LOG_FILE 2>&1 if [ $? -eq 0 ]; then echo "$(date): Backup completed successfully" >> $LOG_FILE echo "Backup completed successfully at $(date)" | mail -s "Backup Success" admin@example.com exit 0 else echo "$(date): Backup attempt $i failed, retrying in $RETRY_DELAY seconds..." >> $LOG_FILE sleep $RETRY_DELAY fi done
echo "$(date): All backup attempts failed" >> $LOG_FILE
echo "Backup failed after $MAX_RETRIES attempts at $(date)" | mail -s "Backup Failure" admin@example.com exit 1
|
🔄 双向同步方案
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
LOG_FILE="/var/log/two-way-sync.log" DIR_A="/path/to/dirA/" DIR_B="/path/to/dirB/"
echo "$(date): Starting two-way synchronization" >> $LOG_FILE
echo "Syncing A -> B" >> $LOG_FILE rsync -av --delete $DIR_A $DIR_B >> $LOG_FILE 2>&1
echo "Syncing B -> A" >> $LOG_FILE rsync -av --delete $DIR_B $DIR_A >> $LOG_FILE 2>&1
echo "$(date): Two-way synchronization completed" >> $LOG_FILE
|
⚙️ 性能优化
🚀 加速传输技巧
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| rsync -avz source/ destination/
rsync -av --no-compress source/ destination/
rsync -av --bwlimit=1000 source/ destination/
rsync -av /source/dir1/ /dest/dir1/ & rsync -av /source/dir2/ /dest/dir2/ & wait
rsync -avz -e 'ssh -c aes128-gcm@openssh.com' source/ user@host:destination/
rsync -av --block-size=8192 source/ destination/
|
📊 传输监控
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| rsync -av --progress source/ destination/
rsync -av --stats source/ destination/
rsync -av --itemize-changes source/ destination/
rsync -av --progress --stats source/ destination/ | grep -E 'speedup|sent|received'
rsync -av --log-file=/var/log/rsync.log source/ destination/
|
⚠️ 注意事项
🔴 危险操作警告
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| rsync -avn --delete source/ destination/ rsync -av --delete source/ destination/
rsync -av / /backup/
rsync -av /local/path user@remote:/path/ rsync -av /local/path/ user@remote:/path/ rsync -av /local/path user@remote:/path
sudo rsync -av source/ destination/
|
🛡️ 安全建议
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| rsync -avz -e ssh source/ user@host:destination/
rsync -av --read-only source/ destination/
rsync -av --checksum source/ destination/
|
🔍 故障排查
🐛 常见问题解决
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| sudo rsync -av source/ destination/
rsync -av --timeout=30 source/ user@host:destination/
rsync -av --itemize-changes source/ destination/
rsync -avvv source/ destination/
rsync -av --progress --stats source/ user@host:destination/ 2>&1 | tee /tmp/rsync-debug.log
ssh -v user@host
|
📋 错误处理
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| rsync -av --ignore-errors source/ destination/
rsync -av --max-retries=3 source/ destination/
rsync -av --exclude='*.lock' source/ destination/
rsync -av --ignore-existing source/ destination/
rsync -av --force source/ destination/
|
📊 总结对比
🆚 rsync vs 其他工具
特性 |
🔄 rsync |
📋 cp |
🗂️ scp |
📦 tar |
增量同步 |
✅ |
❌ |
❌ |
❌ |
带宽优化 |
✅ |
❌ |
❌ |
⚠️ |
属性保持 |
✅ |
⚠️ |
✅ |
✅ |
远程支持 |
✅ |
❌ |
✅ |
❌ |
删除同步 |
✅ |
❌ |
❌ |
❌ |
试运行 |
✅ |
❌ |
❌ |
❌ |
压缩传输 |
✅ |
❌ |
❌ |
✅ |
🎯 使用场景推荐
- 🔄 日常备份:
rsync -av --delete source/ backup/
- 🌐 远程同步:
rsync -avz -e ssh local/ user@host:remote/
- 📁 网站部署:
rsync -av --exclude='config.php' dev/ prod/
- 💾 数据迁移:
rsync -av --progress old-disk/ new-disk/
- ⏰ 定时任务:cron + rsync 自动备份
- 📊 增量备份:
rsync -av --link-dest=/yesterday/ /source/ /today/
📋 最佳实践清单
- ✅ 总是先试运行:
rsync -n
避免意外操作
- ✅ 使用归档模式:
-a
保留所有文件属性
- ✅ 启用压缩传输:
-z
节省带宽(适合文本)
- ✅ 记录操作日志:
--log-file
便于审计和排查
- ✅ 定期验证备份:
--checksum
检查数据完整性
- ✅ 使用SSH密钥:避免密码暴露,提高安全性
- ✅ 设置带宽限制:
--bwlimit
避免影响生产服务
- ✅ 实施监控告警:监控同步任务状态和性能
💡 专业提示:在使用任何破坏性操作(如 --delete
)前,总是先使用 -n
参数进行试运行,确认无误后再执行实际操作!定期验证备份的完整性和可恢复性。