在 Linux/Unix 运维与日常开发工作中,文件与目录的同步是极其高频的需求。从本地备份到远程服务器部署,最强大、最通用的工具非 rsync(Remote Sync)莫属。
rsync 凭借其高效的增量传输算法(只传输差异部分)、丰富的权限保持选项以及对 SSH 的天然支持,成为了服务器数据同步的标准利器。本文总结了 rsync 的核心用法、常用参数细节以及关键踩坑点,方便随时查阅。
一、 rsync 基本语法与命令格式
rsync 的基本调用语法如下:
# 1. 本地文件/目录同步
rsync [OPTION...] SRC... [DEST]
# 2. 通过远程 Shell (如 SSH) 进行同步
rsync [OPTION...] SRC... [USER@]HOST:DEST
rsync [OPTION...] [USER@]HOST:SRC... [DEST]
💡 核心细节:源路径末尾斜杠
/的区别(极重要!)
- 源目录以斜杠结尾(如
/src/):只同步该目录下的内容,不会在目标端创建src目录本身。- 源目录不以斜杠结尾(如
/src):会把src目录本身及其下所有内容完整复制到目标路径。- 注意:目标路径(DEST)末尾是否有斜杠对结果没有任何影响。
二、 常用核心选项详解
1. 黄金组合参数 -a (Archive Mode)
-a 是 rsync 最常用的选项,代表归档模式,用于递归同步并尽可能保持文件的原始属性。它相当于同时开启了以下 7 个参数组合(即 -rlptgoD):
-r(recursive):递归同步子目录。-l(links):保留软链接(符号链接)。-p(perms):保持文件权限。-t(times):保持文件修改时间(modify time)。-g(group):保持属组信息(需要相应权限)。-o(owner):保持属主信息(通常需要 root 权限)。-D(devices):保持设备文件及特殊文件信息。
注意:-a 无法同步“硬链接”,若有硬链接同步需求,需额外加上 -H 参数。
2. 增量对比与时间戳处理 (-t / -I)
-t选项:保持源端时间戳。开启后,rsync 默认开启 Quick Check 策略——在传输前先对比源端与目标端文件的时间戳和文件大小,如果一致则跳过该文件。-I(ignore-times) 选项:放弃 Quick Check 策略。强制对所有文件逐个检查并重新传输。常用于两端文件大小和修改时间相同但内容被破坏/篡改的场景。
3. 链接文件处理 (-l / -L)
-l选项:默认遇到软链接时跳过,加上-l才会以软链接形式同步过去。-L(copy-links) 选项:遇到软链接时,像对待普通文件一样复制其指向的实体文件。
4. 删除与同步保持一致 (--delete)
默认情况下,rsync 仅会更新或新增文件,不会删除目标路径中多余的文件。如果需要保持目标端与源端完全一致(镜像),需添加删除选项:
--delete:源端没有的文件,目标端也予以删除(传输前或传输中处理)。--delete-after:在所有数据传输完毕后再执行删除操作,更安全。
5. 演练模拟与安全预防 (-n / --dry-run)
使用 --delete 选项时具有一定危险性。推荐配合 -n(即 --dry-run)进行模拟测试,它会打印出将要执行新增、修改和删除的文件列表,但不会真正修改磁盘文件。
rsync -avz --delete -n /data/ /backup/data/
6. 断点续传与进度展示 (-P)
传输大文件或网络环境不稳定时,建议使用 -P 选项。-P 是以下两个参数的缩写:
--partial:保留未传输完成的临时文件,下次再次执行时可断点续传。--progress:实时显示当前文件传输的百分比、速率及剩余时间。
7. 排除与包含文件 (--exclude / --include)
在同步大型项目(如 node_modules 或 .git)时,可以通过排除参数优化传输:
# 排除单个目录/规则
rsync -avz --exclude='node_modules' --exclude='*.log' /project/ user@remote:/project/
# 从规则文件中读取排除列表
rsync -avz --exclude-from='exclude-list.txt' /project/ user@remote:/project/
三、 常见实战场景示例
1. 镜像备份本地目录到远程服务器
rsync -avzP --delete /var/www/html/ [email protected]:/var/www/html/
2. 指定非标准 SSH 端口(如 2222)同步
rsync -avzP -e 'ssh -p 2222' /local/dir/ [email protected]:/remote/dir/
提示:若在 ~/.ssh/config 中预先配置了主机别名(如 Host my-server),可直接简化为:rsync -avzP /local/dir/ my-server:/remote/dir/
3. 限制传输带宽(防止网络拥塞)
# 限制传输速率最高为 5000 KB/s (约 5MB/s)
rsync -avzP --bwlimit=5000 /bigdata/ user@remote:/bigdata/
四、 rsync 常用选项对照速查表
| 参数 | 全称 / 说明 |
|---|---|
-a, --archive |
归档模式,递归同步并保持文件权限、修改时间、属主属组及链接等属性。 |
-v, --verbose |
详细模式输出,显示同步过程中的文件名。 |
-z, --compress |
传输时启用数据压缩(适合跨网段或低带宽环境)。 |
-P |
等同于 --partial --progress,支持断点续传并实时显示传输进度。 |
-n, --dry-run |
演练模式,仅打印将要发生的操作而不实际修改任何文件。 |
--delete |
删除目标端存在但源端不存在的文件,保持两端绝对一致。 |
-e COMMAND |
指定远程 shell 通信命令,如 -e 'ssh -p 2222'。 |
-I, --ignore-times |
关闭 Quick Check 快速检查,强制对比并传输所有文件。 |
-u, --update |
更新模式,若目标端文件修改时间比源端更新,则跳过覆盖。 |
--bwlimit=KBPS |
限制传输带宽,单位为 KB/s。 |
文章评论