rsync 命令详解与示例
一、rsync 命令核心功能与基本语法
1. 核心功能
- 增量同步:仅传输源文件与目标文件之间的差异部分,大幅减少数据传输量。
- 跨平台支持:适用于本地文件系统、远程 SSH 或 rsync 协议连接的服务器。
- 元数据保留:支持保留文件权限、时间戳、符号链接、硬链接等属性。
- 灵活过滤:可通过正则表达式、排除/包含规则筛选同步文件。
- 传输优化:支持压缩(
-z
)、带宽限制(--bwlimit
)、断点续传(需配合工具)等。
2. 基本语法
# 本地同步语法
rsync [选项] [源路径] [目标路径]
# 远程同步语法(通过 SSH 协议)
rsync [选项] [源路径] [用户@]远程主机:[目标路径]
rsync [选项] [用户@]远程主机:[源路径] [目标路径]
# 远程同步语法(通过 rsync 守护进程协议)
rsync [选项] rsync://远程主机模块名/[目标路径]
核心参数分类:
- 模式参数:
-a
(归档模式,等价于-rlptgoD
,保留所有元数据并递归同步)-n/--dry-run
(模拟同步,不实际传输文件,用于测试)-v/-vv
(显示详细/更详细的同步过程)
- 传输控制:
-z
(压缩传输数据,提升网络传输效率)--delete
(删除目标中源不存在的文件,实现镜像同步)--ignore-errors
(忽略文件删除/读取错误,继续同步)
- 过滤规则:
--exclude="模式"
(排除符合模式的文件/目录)--include="模式"
(强制包含符合模式的文件/目录)
- 性能优化:
--bwlimit=KB/s
(限制传输带宽,如--bwlimit=1024
)-P
(等价于--partial --progress
,显示进度并保留部分传输文件)-D
(保留设备文件和特殊文件)
二、常用用例与命令示例
1. 本地文件同步
场景:将本地目录 /data/source
同步到 /data/backup
,保留所有属性并显示详细过程。
rsync -av /data/source/ /data/backup/
注意:
- 末尾斜杠
/
表示同步目录内的内容,目标目录不存在时会自动创建。- 若源路径不带斜杠(如
/data/source
),目标目录会创建以source
为名的子目录。
2. 远程同步(通过 SSH)
场景 1:本地文件上传到远程服务器
rsync -avz /local/file.txt user@remote.server:/remote/path/
-z
压缩文件,适合网络传输;远程路径需用户有权限写入。
场景 2:从远程服务器下载文件
rsync -avz user@remote.server:/remote/file.txt /local/path/
场景 3:跨服务器同步(无需本地中转)
rsync -avz -e "ssh -p 2222" user1@server1:/source/ user2@server2:/dest/
-e
指定使用 SSH 协议及端口(默认 22),支持加密传输。
3. 增量备份与镜像同步
场景 1:增量备份(仅更新变化的文件,删除目标中多余文件)
rsync -av --delete /source/ /backup/
警告:
--delete
会使目标与源严格一致,谨慎用于重要数据!建议先用--dry-run
模拟。
场景 2:保留历史版本的增量备份(使用硬链接节省空间)
rsync -av --link-dest=/backup/last/ /source/ /backup/current/
--link-dest
让新备份共享上一次备份的相同文件,仅存储差异部分。
4. 排除/包含特定文件
场景:同步目录时排除日志文件和临时文件
rsync -av --exclude="*.log" --exclude="tmp/" /data/ /backup/
支持通配符(
*
、?
)和目录路径(如tmp/
表示排除整个目录)。
复杂过滤可使用--exclude-from=文件
,在文件中每行写一个排除模式:rsync -av --exclude-from=exclude.list /source/ /dest/
5. 性能优化与高级选项
- 限速传输(避免影响带宽):
rsync -avz --bwlimit=2048 /large_data/ remote:/storage/
- 校验和模式(跳过时间戳检查,确保文件内容一致):
rsync -av --checksum /source/ /dest/
- 保留符号链接(默认保留,若需跟随链接同步实际文件,加
--follow-symlinks
):rsync -av --follow-symlinks /source/ /dest/
三、常见问题与解决方案
1. 权限问题:rsync: failed to open dir: Permission denied
- 原因:源/目标目录无读取/写入权限,或远程用户权限不足。
- 解决:
- 本地同步:使用
sudo
提升权限,或确保用户对路径有对应权限。 - 远程同步:检查远程用户是否为目录所有者,或使用
ssh-keygen
配置无密码登录避免权限中断。
- 本地同步:使用
2. 误删文件:--delete
意外删除目标文件
- 预防:
- 永远先用
--dry-run
模拟同步:rsync -av --delete --dry-run /source/ /dest/
- 重要数据先备份目标目录,或使用
--delete-after
(先传输新文件再删除,减少风险)。
- 永远先用
3. 传输中断:网络不稳定导致同步失败
- 解决:
- 使用
-P
(--partial
)保留未完成传输的临时文件,支持断点续传:rsync -avP /large_file.iso remote:/dest/
- 若频繁中断,可搭配
rsync + nohup
或screen
保持会话持续。
- 使用
4. 文件冲突:源与目标有同名但内容不同的文件
- 现象:rsync 默认以源文件覆盖目标文件,可能导致数据丢失。
- 解决:
- 使用
--compare-dest=参考目录
对比三方文件(需 rsync >= 3.1.0):rsync -av --compare-dest=/reference/ /source/ /dest/
- 手动检查冲突文件(通过
--itemize-changes
输出详细差异):rsync -av --itemize-changes /source/ /dest/
- 使用
5. 符号链接异常:同步后链接失效或指向错误
- 原因:默认 rsync 保留符号链接本身,不跟随其指向的文件。
- 解决:
- 若需保留链接(推荐):无需额外参数,默认行为正确。
- 若需同步链接指向的实际文件:添加
--follow-symlinks
,但可能导致循环链接错误。
四、最佳实践总结
- 测试优先:复杂同步任务先用
--dry-run
模拟,确认输出无误后再执行。 - 备份关键数据:对重要目录同步前,手动备份目标数据(尤其是含
--delete
的操作)。 - 日志记录:通过
--log-file=rsync.log
记录同步过程:rsync -av --delete --log-file=sync.log /source/ /dest/
- 版本控制:结合
--link-dest
实现基于硬链接的版本化备份,节省存储空间。
提示:根据具体场景调整参数,必要时查阅官方文档(
man rsync
)获取完整选项说明。