使用--delete选项可删除目标中源不存在的文件,实现完全镜像同步;关键须确保源路径以斜杠结尾且--delete置于路径前,否则易误删。

直接用 --delete,但必须配对斜杠规则,否则删错目录是常态。
rsync --delete 的基本行为
--delete 不是“删除目标里多的文件”这么简单——它只在同步完成后,对比源和目标的「当前层级目录内容」,删掉目标中源没有的条目。它不递归扫描整个目标树,也不管你心里想删哪一层。
关键点在于:是否带尾部斜杠,决定了「对比范围」:
- 源写成
/home/user/data/(带斜杠)→ rsync 把data/里的内容当作源主体,目标目录下所有不在data/中的文件都会被考虑删除 - 源写成
/home/user/data(不带斜杠)→ rsync 把data这个目录本身当作一个要同步的项,目标会多出一层data目录,--delete的作用范围就变成目标data/内部,而不是目标根目录
多数人想要的是前者:让目标目录「完全镜像」源目录内容。那就必须确保源路径以 / 结尾。
为什么加了 --delete 还没删文件?
常见原因不是命令写错,而是执行时机或权限问题:
-
--delete必须放在源和目标路径「之前」,比如rsync -av --delete src/ dst/;如果写成rsync -av src/ dst/ --delete,rsync 会忽略它 - 目标目录下有子目录被挂载(如
/backup/logs是另一个磁盘 mount 点),rsync 默认不会跨挂载点删除,需加--delete-cross-mounts - 目标文件属主不是当前用户,且没写权限,
--delete会跳过并报skipping non-regular file或类似警告,但不中断 - 用了
--exclude却忘了--delete-excluded,被排除的文件在目标里仍会被删——除非你明确加--delete-excluded让它保留
--delete-before、--delete-after、--delete-delay 的区别
三者影响的是「删除动作发生的时机」,直接影响同步一致性与安全性:
-
--delete-before:先删目标多余文件,再传新文件。适合空间紧张场景,但若传输中断,目标可能变空 -
--delete-after:默认行为,同步完再删。最安全,能保证目标始终有完整副本,但临时占用双倍空间 -
--delete-delay:同步过程中缓存要删的文件列表,等所有传输完成再统一删。效果接近--delete-after,但更适合脚本中做原子清理
生产环境建议默认用 --delete-after,确认逻辑无误后再切到 --delete-before 节省空间。
真正安全的操作流程
别信“试一次就知道”,--delete 没有后悔键。每次执行前必须走这三步:
- 先跑干运行:
rsync -avn --delete src/ dst/,看输出里deleting xxx是否符合预期 - 检查目标目录是否有重要但未纳入源管理的文件(比如手动放的日志、配置备份),用
--exclude显式保护 - 确认源路径结尾有斜杠、
--delete在参数区靠前、目标路径可写——这三个条件缺一不可
最容易被忽略的是路径斜杠和参数顺序,90% 的误删都发生在这两个地方,而不是选项本身有多难懂。











