rsync的核心价值是增量同步而非简单复制,仅传输变化的数据块,配合-a(归档模式)、-v(详细输出)、-z(压缩)可高效安全同步;需谨慎使用--delete,推荐--delete-after与--dry-run组合验证。

rsync 命令基础用法:为什么不能直接用 cp 或 scp
rsync 的核心价值不是“复制”,而是“增量同步”——它只传变化的块,不是整个文件。当你反复同步大日志、数据库 dump 或代码仓库时,rsync -avz 比 scp -r 快几倍甚至几十倍,尤其在网络不稳定或带宽受限时优势明显。
常见错误是漏掉 -a(归档模式):它隐含 -r(递归)、-l(保留软链)、-p(权限)、-t(时间戳)、-g(组)、-o(所有者),缺一可能导致权限错乱或软链失效;-v 建议始终加上,便于确认哪些文件真被传输了;-z 开启压缩(仅对非已压缩文件有效,如文本日志)。
- 本地同步:
rsync -avz /src/ /dst/(注意源路径末尾的/:它决定是否把src目录本身也建进去) - 远程同步(SSH 默认):
rsync -avz /local/path/ user@host:/remote/path/ - 如果远程 SSH 端口不是 22:
rsync -avz -e "ssh -p 2222" /local/ user@host:/remote/
排除文件与目录:.git、临时文件、锁文件怎么跳过
不加过滤的 rsync 很容易把 .git、*.log、cache/、tmp/ 一起拖过去,既浪费带宽又污染目标环境。rsync 的 --exclude 是最常用也最容易写错的参数。
关键点:排除规则按顺序匹配,且路径是相对于源路径的;--exclude 只影响传输,不影响源端文件;多个排除用多个 --exclude,不要用空格拼成一个字符串。
PyCharm 2026.2.0.1 Linux版提供 JetBrains 官方 2026.2.0.1 版本安装包,适合需要指定 PyCharm 版本进行 Python 项目开发、运行和调试的用户。
- 排除单个目录:
rsync -avz --exclude=".git" /project/ user@host:/backup/project/ - 排除多种后缀:
rsync -avz --exclude="*.tmp" --exclude="*.swp" /data/ dest/ - 排除嵌套目录:
rsync -avz --exclude="logs/**" --exclude="node_modules/" /app/ /backup/app/(**表示任意层级) - 更清晰的方式是用
--exclude-from=excludes.txt,文件里每行一个规则,适合复杂项目
同步失败常见报错:Permission denied、Connection refused、No space left on device
这些错误看似简单,但根因常被误判。比如 Permission denied (publickey) 不一定是密钥没配好,可能是目标用户家目录或 ~/.ssh 权限太宽松(SSH 强制要求 700 和 600);No space left on device 也不一定是磁盘满,可能是 inode 耗尽(df -i 查看)。
-
@ERROR: chroot failed:说明 rsync daemon 模式配置了chroot = yes,但目标路径不存在或权限不对;普通 SSH 同步不会出现此错 -
rsync: failed to set times on ... Permission denied:目标端文件属主不是当前用户,且没开sudo;加--omit-dir-times或确保目标目录可写 -
connection unexpectedly closed:大概率是网络中断或 SSH 服务端设置了ClientAliveInterval过短;可在-e中追加"ssh -o ServerAliveInterval=30" - 同步中途断了?放心重跑,rsync 天然支持断点续传,只要没加
--delete就不会误删
--delete 选项的危险性:什么时候该用,什么时候必须禁用
--delete 的作用是“让目标严格等于源”——源删了的文件,目标也会被删。它很干净,也很致命。生产备份中,90% 的误删事故都源于这个选项被无脑加上。
真正需要它的场景极少:比如你维护一个静态网站镜像,每次构建后全量覆盖;或者做 CI/CD 部署,目标就是源的精确副本。除此之外,备份用途一律建议用 --delete-after(删操作放在同步完成后)+ --dry-run(先模拟看要删啥)双保险。
- 安全组合:
rsync -avz --delete-after --dry-run /src/ user@host:/dst/→ 确认输出无误后再去掉--dry-run - 更保守做法:用
--backup --suffix=_$(date +%Y%m%d)把将被覆盖/删除的文件先备份,留出恢复窗口 - 绝对不要在未验证的脚本里写
rsync -avz --delete /home/ /backup/—— 一个反斜杠方向写反,/变成//,就可能触发根目录清空
真正难的从来不是命令怎么写,而是想清楚“我到底要同步什么、保留什么、允许丢失什么”。rsync 很快,但删错的数据,再快也回不来。










