rsync 默认是镜像同步而非备份,必须加 --backup、--backup-dir 或 --link-dest 才能保留旧文件;验证安装用 rsync --version,权限需提前检查,远程备份应使用 ssh 加密。

rsync 不是“装完就能当备份用”的工具——它默认是镜像同步,删源文件,目标就跟着空。真正做备份,必须加 --backup、--backup-dir 或 --link-dest 才行。
怎么确认 rsync 已安装并可用
大多数 Linux 发行版预装了 rsync,但不能假设它一定在 PATH 里、版本够新、或有足够权限读写目标路径。
- 运行
rsync --version看是否输出版本号(如rsync version 3.2.7) - 如果报
command not found,按发行版装:sudo apt install rsync(Ubuntu/Debian)、sudo yum install rsync(CentOS 7)、sudo dnf install rsync(CentOS 8+/Fedora) - 验证对目标目录的写权限:
touch /backup/testfile && rm /backup/testfile,失败则需sudo chown或改用有权限的用户
为什么直接 rsync -av /src/ /dst/ 不算备份
因为 rsync -av 默认行为是“让 /dst/ 和 /src/ 完全一致”——它不是存档,而是镜像。一旦你在源里删了一个文件,下次同步,目标里那个文件就没了。
- 现象:
rm /src/config.yaml→ 运行rsync -av /src/ /dst/→/dst/config.yaml消失 - 这不是 bug,是设计:rsync 的核心逻辑是“同步”,不是“备份”
- 要保留被覆盖或删除的旧文件,必须显式启用备份机制:
--backup(重命名旧文件)、--backup-dir(移入指定目录)、--link-dest(硬链接复用)
三种实用备份方式选哪个
取决于你要的是简单记录、多日快照,还是空间敏感型长期归档。
-
单次带时间戳备份(适合测试或小量数据):
rsync -av --backup --suffix=".20260523" /src/ /dst/
→ 被覆盖的文件变成file.txt.20260523;注意后缀不自动更新,脚本里得用$(date +%Y%m%d) -
每日独立快照 + 硬链接节省空间(推荐日常使用):
先建当天目录:mkdir /backup/20260523
再执行:rsync -av --delete --link-dest=/backup/20260522/ /src/ /backup/20260523/
→ 未变文件用硬链接指向前一天,每个目录都可单独挂载/校验;要求源和备份同文件系统 -
历史文件集中归档(适合审计或合规):
rsync -av --backup --backup-dir=/backup/archive/20260523/ --delete-after /src/ /dst/
→/dst/始终是最新版,所有被替换/删除的旧文件进/backup/archive/20260523/;--delete-after比--delete更安全
容易被忽略的关键细节
这些点不报错,但会让备份失效、变慢,或某天突然丢数据。
-
--link-dest路径必须存在且可读,否则 rsync 退化为全量复制——建议脚本开头加[ -d /backup/20260522 ] || { echo "link-dest missing"; exit 1; } - 排除干扰文件:不加
--exclude,.DS_Store、Thumbs.db、*.tmp可能同步失败或污染备份;推荐固定写法:--exclude='.git/' --exclude='node_modules/' --exclude='*.log' - 远程备份务必走 SSH:
rsync -avz -e "ssh -p 2222" /src/ user@host:/dst/;别用裸 rsync daemon(端口 873),没加密、难审计 - 脚本中所有路径用绝对路径,
rsync命令写/usr/bin/rsync而非仅rsync;cron 环境无用户 PATH,容易静默失败
最常出问题的不是命令写错,而是把 --delete 当成“保证一致”的银弹,却忘了它和 --backup 冲突、和 --link-dest 配合时又依赖前序目录存在。备份这件事,靠的不是一次跑通,而是每次执行前心里清楚:旧文件到底去哪了。











