下面我将从基础用法到高级用法,并配合实际场景示例,为你详细讲解 rsync 的启动命令。

核心语法结构
rsync 的命令基本结构如下:
rsync [选项] 源文件 目标文件
- 选项:控制
rsync的行为,如是否压缩、是否显示进度、是否删除目标端多余的文件等。 - 源文件:可以是本地路径,也可以是远程路径(格式为
user@host:remote_path)。 - 目标文件:同样可以是本地路径或远程路径。
关键点:
- 源路径和目标路径的结尾的斜杠 非常重要!
src/(带斜杠):表示复制src目录内部到目标目录。src(不带斜杠):表示复制src这个目录本身到目标目录。
常用选项详解
理解这些选项是掌握 rsync 的关键。
| 选项 | 缩写 | 描述 |
|---|---|---|
-a |
--archive |
归档模式,这是最常用的选项,它相当于 -rlptgoD 的集合,保留了文件的所有属性(权限、时间戳、所有者、组等)。 |
-v |
--verbose |
详细输出,在终端显示同步的文件列表,可以多次使用(如 -vv)来查看更详细的信息。 |
-z |
--compress |
压缩传输,在传输过程中对文件进行压缩,可以减少网络带宽的占用,尤其是在传输大文件或慢速网络时非常有用。 |
-h |
--human-readable |
人性化数字,以 KB, MB, GB 等格式显示文件大小,方便阅读。 |
--progress |
- | 显示传输进度条,让你能看到每个文件的传输速度和剩余时间。 |
-n |
--dry-run |
预演,只模拟将要执行的操作,而不会真正修改任何文件。强烈建议在执行重要操作前先使用此选项。 |
--delete |
- | 删除,删除目标端中存在但源端已不存在的文件。此操作非常危险,请谨慎使用! |
--exclude |
- | 排除文件,指定一个模式来排除不需要同步的文件或目录。--exclude "*.log"。 |
--exclude-from |
- | 从一个文件中读取需要排除的文件列表。 |
-e |
--rsh |
指定远程 shell,默认是 ssh,你可以用它来指定不同的端口或使用其他 shell 程序。-e "ssh -p 2222"。 |
-P |
- | 等同于 --partial --progress。--partial 会让 rsync保留部分传输的文件,方便中断后继续传输。 |
-u |
--update |
更新,只在目标端的文件比源端旧时,才进行同步(跳过已更新的文件)。 |
-b |
--backup |
备份,当目标文件被覆盖前,会先将其备份。 |
--backup-dir |
- | 指定备份文件存放的目录。 |
常用场景及命令示例
场景1:本地目录同步(最简单)
将 /home/user/docs 目录同步到 /backup/docs。

# 基础同步(会创建 /backup/docs 目录,并将 docs 内部内容同步进去) rsync -av /home/user/docs/ /backup/docs # 如果想同步整个目录(即 /backup 目录下会多一个名为 docs 的目录) rsync -av /home/user/docs /backup # 带进度条和压缩的本地同步 rsync -avzP /home/user/large_files/ /mnt/external_drive/large_files/
场景2:远程目录同步(核心用法)
这是 rsync 最强大的功能之一。
从远程服务器拉取文件到本地:
# 从远程服务器的 /home/user/docs 拉取到本地的 /backup/docs rsync -avz user@remote_server_ip:/home/user/docs/ /backup/docs # 指定 SSH 端口(如果不是默认的 22) rsync -avz -e "ssh -p 2222" user@remote_server_ip:/home/user/docs/ /backup/docs
从本地推送文件到远程服务器:
# 将本地的 /home/user/docs 推送到远程服务器的 /backup/docs rsync -avz /home/user/docs/ user@remote_server_ip:/backup/docs # 使用更快的压缩算法(如果两端都支持) rsync -avz -e "ssh -p 2222" --compress-level=9 /home/user/docs/ user@remote_server_ip:/backup/docs
场景3:创建镜像(精确同步)
这是制作服务器备份或网站镜像的常用方法。--delete 选项确保目标目录和源目录完全一致。

警告:--delete 会删除目标端多余的文件,请务必先用 -n (dry-run) 测试!
# 预演:查看将要执行的操作,特别是哪些文件会被删除 rsync -avzn --delete user@remote_server_ip:/var/www/ /local_mirror/www/ # 确认无误后,执行真正的同步 rsync -avz --delete user@remote_server_ip:/var/www/ /local_mirror/www/
场景4:排除特定文件或目录
在同步时,通常不需要同步日志文件、临时文件或 .git 目录。
# 排除所有 .log 文件和 tmp 目录
rsync -avz --exclude='*.log' --exclude='tmp' /source/ /destination/
# 排除多个文件类型(使用通配符)
rsync -avz --exclude={'*.tmp', '*.bak'} /source/ /destination/
# 从一个文件中读取排除规则(推荐用于复杂的排除列表)
# 创建一个文件 exclude.txt,内容如下:
# *.log
# .git/
# tmp/
# node_modules/
rsync -avz --exclude-from='exclude.txt' /source/ /destination/
场景5:设置定时任务(Cron Job)
使用 rsync 进行自动化备份是最佳实践。
-
创建一个备份脚本,
/home/user/scripts/backup.sh:#!/bin/bash # 设置变量 SOURCE_DIR="/home/user/docs" DEST_USER="backup_user" DEST_SERVER="backup.server.com" DEST_DIR="/backups/user_docs_$(date +%Y%m%d)" # 执行 rsync rsync -avz --delete -e "ssh -i /home/user/.ssh/backup_key" "$SOURCE_DIR/" "${DEST_USER}@${DEST_SERVER}:${DEST_DIR}" echo "Backup completed at $(date)" -
给脚本添加可执行权限:
chmod +x /home/user/scripts/backup.sh
-
编辑 crontab:
crontab -e
-
添加一行来每天凌晨2点执行备份:
0 2 * * * /home/user/scripts/backup.sh >> /var/log/my_backup.log 2>&1
这行命令的意思是:每天()凌晨2点(
0 2),执行/home/user/scripts/backup.sh脚本,并将标准输出和错误输出都追加到/var/log/my_backup.log文件中。
最佳实践总结
- 总是从
-n(dry-run) 开始:在对生产环境或重要数据进行操作前,先用-n预演,确认操作符合预期。 - 使用
-a(archive):在大多数情况下,-a是最佳选择,因为它能完整地保留文件属性。 - 善用
-v和-h:-vh组合能让你清楚地看到正在同步什么以及文件大小。 - 网络环境差用
-z:对于跨网络或大文件传输,-z可以显著提高速度。 - 谨慎使用
--delete:这个功能强大但危险,确保你真的需要它,并且已经通过-n测试过。 - 为自动化配置 SSH 密钥登录:在设置定时任务时,配置好 SSH 免密登录,避免脚本因密码输入而中断。
- 使用
--exclude过滤无用文件:保持同步的干净和高效,避免同步日志、缓存等不需要的文件。
希望这份详细的指南能帮助你全面掌握 rsync 的启动命令!
