rsync路径末尾斜杠决定同步粒度:/path/同步内容,/path同步目录本身;--delete作用范围受其影响,必须配合--dry-run预检、--delete-before与--force组合、绝对路径及保险目录(如/sync/app-new)规避误删风险。

关键在于控制路径粒度和加安全防护层,而不是依赖“小心操作”这种不可靠习惯。
必须严格区分源路径末尾斜杠
这是最基础也最容易踩坑的一点。rsync 对 /path 和 /path/ 的处理逻辑完全不同:
-
rsync -av --delete /data/ user@host:/backup/:同步
/data/下所有内容到/backup/,目标端只清理/backup/内部多余项 -
rsync -av --delete /data user@host:/backup:把整个
/data目录(含目录名)复制过去,变成/backup/data,此时--delete作用范围仍是/backup/,但结构已变 -
rsync -av --delete / data/ user@host:/:危险!源是根目录
/,目标也是/,--delete会清空远端整个系统
强制使用 --dry-run 先预演
任何带 --delete 的命令上线前,先加 --dry-run 看它到底打算删什么:
rsync -av --delete --dry-run /src/ user@host:/dst/- 输出里会明确列出即将被删除的文件,比如
deleting old_config.conf、deleting /dst/unwanted/ - 只要看到
deleting /、deleting /etc/、deleting /home/这类路径,立刻中止,检查源目标路径是否写错
用 --delete-before + --force 配合绝对路径限定
如果确实需要镜像级清理,推荐组合策略降低误删风险:
-
--delete-before:先删再传,避免传输中断后目标残留半成品 -
--force:强制删除只读文件或非空目录(否则某些文件可能删不掉,导致状态不一致) - 始终用完整绝对路径,禁用相对路径或变量未展开的写法,例如不用
$DIR而用/var/www/html/ - 可加
--include='*/' --exclude='*' --delete-excluded显式控制哪些子目录允许参与同步
给目标路径加一层保险目录
生产环境建议在目标端设置专用同步根,不直接指向关键路径:
- 不要:
rsync ... /srv/app/ user@prod:/srv/app/ - 改为:
rsync ... /srv/app/ user@prod:/sync/app-new/ && mv /sync/app-new /srv/app - 这样即使命令出错,最多影响临时目录
/sync/app-new,主服务目录不受波及 - 配合软链接切换,还能实现原子更新











