rsync --delete 安全同步需配合 --exclude 排除本地专属配置,避免误删;排除规则须置于源目标路径之间,优先使用 --dry-run 验证,并禁用 --delete-excluded。

使用 rsync --delete 进行全镜像同步时,若不加控制地删除目标端“源端不存在”的文件,极易误删本地专属配置(如 ~/.bashrc、/etc/myapp/local.conf 或项目中的 .env),导致服务异常或环境崩溃。关键在于:**--delete 本身不识别“受保护文件”,必须配合 --exclude 和合理的同步方向设计,才能安全排除本地独有配置**。
明确同步方向与保护逻辑
全镜像同步通常指“以源为权威,目标完全对齐源”。此时,本地专属配置本就不该存在于源目录中——它们应被显式排除,而非依赖 rsync 自动保留。
正确思路是:把本地专属配置从同步路径中剥离,或用 --exclude 明确声明不参与同步和删除流程。
- ✅ 推荐做法:将本地配置存放在同步根目录之外(如
/opt/myapp/conf/local/),并在 rsync 命令中不包含该路径 - ✅ 若必须共存于同步目录内(如
config/.env),则必须用--exclude='.env'—— 注意:该参数既阻止传输,也阻止--delete删除目标端对应文件 - ❌ 错误假设:认为
--delete会“智能跳过未同步的文件”——它只会删除目标端存在但源端没有的任何匹配文件
排除规则必须写在同步路径之前
rsync 的 exclude 规则顺序敏感:所有 --exclude 必须出现在源路径和目标路径之间,且优先级高于路径通配。否则规则可能失效。
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
正确示例(同步 /srv/app/ 到远程,排除本地 .env 和 local-settings.php):
rsync -av --delete \ --exclude='.env' \ --exclude='local-settings.php' \ /srv/app/ user@host:/srv/app/
- 注意末尾斜杠:
/srv/app/表示同步目录内容,/srv/app(无斜杠)会同步整个目录名,影响 exclude 路径匹配 - 排除模式基于目标端相对路径:上述命令中
--exclude='.env'指排除同步路径下的.env文件(即/srv/app/.env) - 如需排除子目录中的特定文件,可写
--exclude='config/local/*.conf'
用 --delete-excluded 需极度谨慎
该参数会让 rsync 在删除时,也清除那些被 --exclude 排除但在目标端已存在的文件——这与“保护本地配置”目标完全相悖。
- ⚠️ 绝对不要在需要保留本地配置的场景中启用
--delete-excluded - 它适用于“严格清理临时文件”的维护任务,例如清除构建产物,而非生产环境镜像同步
- 验证方式:先加
--dry-run,观察输出中是否出现你希望保留的文件被标记为 “deleting”
增强安全:先模拟再执行 + 白名单式排除
对关键环境,建议分两步操作,并采用更保守的排除策略:
- 第一步:用
rsync -avn --delete ...模拟运行,检查输出中是否有不该删的文件(如deleting config/.env),确认无误再删n - 第二步:改用白名单思维——不用
--exclude列黑名单,而用--include显式指定哪些要同步,最后--exclude='*'拦截其余项(适合结构清晰的部署) - 示例白名单同步(只传代码和公共配置):
rsync -av --delete \<br> --include='*.php' \<br> --include='config/common/' \<br> --exclude='*' \<br> /srv/app/ user@host:/srv/app/

















