rsync 的 --delete-excluded 到底会删除什么?

rsync --delete-excluded 会把"被 --exclude 排除、但已存在于目标目录"的文件删除,让排除规则从源镜像到目标。威力大、风险也大,用错会误删数据。本文讲清行为、示例与安全用法。

最佳实践
网络请求路由与访问控制示意

一句话:--delete-excluded 让 rsync 在同步完成后,把目标目录里"命中排除规则"的文件也删掉——相当于把源的排除清单"镜像"到目标。

行为拆解

配合 --exclude 使用时,整个流程是:

  1. 按排除规则跳过源中匹配的文件(不传输);
  2. 正常同步其余文件到目标;
  3. --delete-excluded 生效:扫描目标目录,凡是命中排除规则的文件,即使在源里根本不参与同步,也一律删除。
rsync -av --delete-excluded --exclude='*.log' source/ destination/

效果:destination/ 下所有现存的 *.log 文件会被删除——即使它们一开始就在目标目录里、和源毫无关系。

与之对比:--delete 删除的是"目标有而源没有"的文件;--delete-excluded 在此基础上把"被排除的"也纳入删除范围。

危险警告

这是 rsync 最容易造成误删的选项之一。经典事故:排除规则写得比预期宽(如 --exclude='cache' 匹配到目标里一个同名的业务目录),目标数据被静默清除。

安全用法三步:

# 1. 先空跑,看清楚它要删什么
rsync -avn --delete-excluded --exclude='*.log' source/ destination/

# 2. 确认输出中 deleting 的文件确实可删

# 3. 去掉 -n 正式执行

排除模式尽量写具体路径(--exclude='/cache/' 而不是 --exclude='cache'),缩小匹配面。

常见问题(FAQ)

Q:--delete 和 --delete-excluded 的区别?
--delete 只删"目标比源多出来且未被排除"的文件;--delete-excluded 额外删除"目标里命中排除规则"的文件。后者是前者的超集。

Q:只想清理目标里的日志文件,不想动其他排除项?
把排除规则拆细:用多个 --exclude 精确指定,或改用单独脚本 find destination -name '*.log' -delete,比 --delete-excluded 更可控。

Q:空跑(-n)显示的删除列表可信吗?
可信,--dry-run 与实际执行的文件列表一致。这是使用该选项前的必备步骤。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台