Linux:rsync命令实战指南——从基础到高级应用 1. rsync命令基础入门第一次接触rsync是在我负责公司服务器迁移的时候。当时需要把几十GB的网站数据从旧服务器搬到新服务器用scp命令传输了整整一晚上结果第二天发现漏了几个重要配置文件。同事推荐我用rsync结果第二次迁移只用了不到半小时而且所有文件属性都完美保留。这就是rsync给我的第一印象——又快又稳的同步工具。rsync全称remote sync是Linux系统下最强大的文件同步工具之一。它最厉害的地方在于增量传输机制只传输源文件和目标文件之间的差异部分。比如你有个10GB的大文件只修改了其中1MB内容rsync就只会传输这1MB的变化数据。这个特性在我们日常工作中特别实用备份网站数据时不用每次都全量拷贝同步开发代码到测试环境只上传修改过的文件跨服务器迁移时断网了也不用重头开始基本命令格式很简单rsync [选项] 源文件 目标文件新手最容易搞混的是路径结尾的斜杠。举个例子# 会把source目录下的所有文件同步到destination目录下 rsync -a source/ destination # 会把source整个目录同步到destination目录下多一层source目录 rsync -a source destination2. 常用参数详解刚开始用rsync时我被它上百个参数选项吓到了。其实日常使用掌握这几个核心参数就够了-a (archive模式)这是最常用的组合参数相当于同时启用-r 递归同步子目录-l 保留符号链接-p 保留文件权限-t 保留修改时间-g 保留属组-o 保留属主需要root权限-D 保留设备文件-v (verbose)显示详细同步过程建议至少加一个-v这样能看到哪些文件正在传输。我习惯用-vv甚至-vvv来获取更详细的调试信息。-z (compress)传输时压缩数据特别适合网络带宽有限的情况。实测同步文本文件时能节省70%以上的传输量。--delete这个参数要慎用它会删除目标端存在但源端没有的文件。有次我不小心用它同步错了目录把生产环境的用户上传文件全删了还好有备份。建议先用--dry-run测试。-P结合了--partial保留部分传输的文件和--progress显示进度条大文件传输时特别有用。我经常用它来同步虚拟机镜像文件。参数组合示例# 安全同步模式先试运行 rsync -avn --delete source/ destination/ # 实际执行同步 rsync -avP --delete source/ destination/3. 本地文件同步实战上周我帮朋友整理他的照片库正好用到了rsync的本地同步功能。他的照片分散在三个硬盘里有些重复文件有些是不同尺寸的副本情况相当混乱。案例1合并多个目录# 把/mnt/disk1/photos和/mnt/disk2/pics合并到/media/backup/all_photos rsync -av /mnt/disk1/photos/ /media/backup/all_photos/ rsync -av /mnt/disk2/pics/ /media/backup/all_photos/这里有个实用技巧用--ignore-existing可以跳过目标端已存在的文件避免重复传输rsync -av --ignore-existing /mnt/disk2/pics/ /media/backup/all_photos/案例2排除特定文件类型朋友想排除所有的RAW格式照片.cr2文件rsync -av --exclude*.cr2 /mnt/disk1/photos/ /media/backup/all_photos/更复杂的排除规则可以写到文件里# 创建exclude.list文件 echo *.cr2 exclude.list echo temp/ exclude.list rsync -av --exclude-fromexclude.list source/ destination/4. 远程同步与备份方案远程同步是rsync的杀手级功能。我们公司现在用这套方案做每日数据库备份SSH方式同步rsync -avz -e ssh -p 2222 /var/lib/mysql/ userbackup-server:/backups/mysql/这里的-z参数启用压缩-e指定SSH端口如果改了默认端口。建议先配置SSH密钥认证避免每次都要输密码。定时备份脚本我写了个简单的备份脚本放在crontab里每天运行#!/bin/bash DATE$(date %Y%m%d) rsync -avz --delete --backup --backup-dir/backups/old_$DATE \ /var/www/ userbackup-server:/backups/webroot/这个脚本做了三件事同步/var/www/到远程备份服务器删除备份服务器上多余的文件--delete将被替换的文件保存到带日期的子目录--backup-dir带宽限制如果备份服务器在公网可以用--bwlimit限制带宽单位KB/srsync -avz --bwlimit1000 large_files/ userremote:/backups/5. 高级技巧与疑难解答用了这么多年rsync我总结了一些教科书上不会写的实战经验1. 处理大量小文件同步数十万个小型源代码文件时可以加上这些参数rsync -avW --inplace source/ destination/-W禁用增量检测--inplace直接修改目标文件能显著提升速度。2. 断点续传网络不稳定时的救命稻草rsync -avP --partial-dir.rsync-partial source/ userremote:destination/--partial-dir指定存放中断文件的位置下次同步会自动继续。3. 对比同步结果同步完成后用这个命令检查两边是否一致rsync -avnc --delete source/ destination/-n是模拟运行-c基于文件校验和而非修改时间。4. 常见错误处理rsync: failed to set permissions: 尝试加上--no-permsargument list too long: 使用--files-from从文件读取文件列表connection timeout: 添加--timeout60增大超时时间最后分享一个真实踩坑经历有次用rsync同步MySQL数据目录结果数据库直接挂了。后来才知道运行中直接同步数据库文件会导致数据不一致。现在我都先用mysqldump导出或者锁定表后再同步。