要让 rsync 自动删除目标端冗余文件,必须使用 --delete 且源路径以斜杠结尾、--delete 置于路径前;推荐 --delete-after 模式,配合 -n 预览、--delete-cross-mounts 和 --delete-excluded 等选项确保准确安全清理。

要在 Linux 中让 rsync 在传输时自动删除目标端冗余文件(即源端不存在、但目标端存在的文件),核心是正确使用 --delete 及其配套规则,而不是简单加个参数就完事。关键在路径写法、参数顺序和执行逻辑。
必须确保源路径以斜杠结尾
rsync 对「同步主体」的判断完全取决于源路径是否带尾部 /:
-
正确写法(推荐):
rsync -av --delete /data/src/ /backup/
→ 把/data/src/目录下的内容作为同步主体,--delete会清理/backup/中不在src/内的文件 -
错误写法:
rsync -av --delete /data/src /backup/
→ 把src这个目录本身当作一个条目同步,结果会在/backup/下创建src/子目录,--delete只作用于/backup/src/内部,而非整个/backup/
参数位置不能错:--delete 必须放在路径之前
rsync 会忽略路径之后的 --delete,命令无效:
- ✅ 有效:
rsync -av --delete src/ dst/ - ❌ 无效:
rsync -av src/ dst/ --delete(rsync 当作多余参数丢弃)
根据场景选删除时机
三种删除模式影响数据安全性和磁盘空间占用:
-
--delete-after(默认):先完成所有文件传输,再统一删除目标冗余项。最稳妥,中断也不会丢数据 -
--delete-before:先清空目标多余文件,再传新文件。省空间,但传输失败可能导致目标为空 -
--delete-delay:传输中记录待删列表,结束后再删。适合脚本中做原子化清理
生产环境建议从 --delete-after 起步,确认无误后再评估是否切到 --delete-before。
常见失效原因与应对
加了 --delete 却没删文件?先排查这些:
- 用
-n(dry-run)预览:rsync -avn --delete src/ dst/,看输出里是否有deleting xxx行 - 目标有挂载子目录(如
/backup/logs是独立 mount):需额外加--delete-cross-mounts - 目标文件权限不足(非属主或无写权限):rsync 会跳过并提示
skipping non-regular file,需提前修复权限或切到 root 执行 - 用了
--exclude却没加--delete-excluded:被排除的文件在目标中仍会被删掉;若想保留,必须显式加上该选项











