rsync 删除目标目录中比源目录多出的文件需使用 --delete 选项,以源为基准清理目标中不存在的文件;路径末尾斜杠必须正确,如 a/ 和 b/ 才表示同步目录内容,否则会复制整个目录结构。

用 rsync 删除目标目录中比源目录多出的文件,核心就是 --delete 选项。它不是直接“删目录”,而是以源为基准,把目标里“源没有”的文件全部清理掉。
关键前提:路径末尾斜杠不能错
这是最容易出错的地方:
- 写成
/path/source/(带斜杠)→ 表示同步该目录 内部内容 - 写成
/path/source(不带斜杠)→ 表示同步该目录 本身(会把 source 目录整个复制进去)
要清空或对齐目标,源必须是带斜杠的空目录,例如 /tmp/empty/;若同步两个真实目录,也必须都带斜杠,如 rsync -a --delete dirA/ dirB/。
常用组合与作用差异
--delete 默认在传输过程中删除(--delete-during),但你可以显式指定时机:
-
--delete-before:先删目标多余文件,再传新文件 → 更安全,适合清理缓存类目录 -
--delete-during:边传边删 → 默认行为,效率高 -
--delete-after:传完再删 → 可确保新文件已落盘,再清理旧文件
日常清理推荐 --delete-before,避免传输中断后残留部分旧文件。
安全执行三步法
别急着删,先确认、再预演、最后执行:
-
创建空源目录:
mkdir /tmp/empty -
干运行预览:
rsync -avn --delete-before /tmp/empty/ /target/dir/(-n即--dry-run,只显示将删哪些) -
正式执行:
rsync -av --delete-before /tmp/empty/ /target/dir/(删完后可补rmdir /target/dir)
同步两个非空目录时的典型用法
比如要把 A 目录结构完全覆盖到 B,同时清除 B 中 A 没有的文件:
- 确保 A 和 B 都存在,且你想让 B 和 A 完全一致
- 运行:
rsync -av --delete-before A/ B/ - 注意:A/ 和 B/ 后面的斜杠都必须有,否则逻辑完全不同
这条命令会让 B 成为 A 的精确副本——包括文件内容、权限、时间戳,并自动剔除 B 中多余的项。











