误删后关键在及时止损与备份恢复:一、用rsync -av --delete --dry-run预览操作并检查deleting行;二、立即停止写入,卸载分区或停服务,避免覆盖;三、依赖硬链接快照(如rsnapshot)和多版本备份实现可逆恢复。

rsync 带 --delete 时没加 --dry-run,导致目标目录被误删,这种情况很常见但后果严重。关键不是“能不能恢复”,而是“有没有备份”和“是否及时止损”。下面分三步讲清楚:如何预防、误删后怎么应急、以及备份恢复怎么做。
一、用 --dry-run 真正看清 rsync 要做什么
--dry-run 不是万能保险,它只模拟删除和同步动作,但结果依赖于当前文件状态和 rsync 参数组合。很多人跑完 --dry-run 没仔细看输出,就直接去掉参数执行,这是最大风险点。
- 务必把
--dry-run和-v(verbose)一起用,例如:rsync -av --delete --dry-run /src/ user@host:/dst/ - 重点检查输出里有没有大量
deleting xxx行——尤其是你本意不想删的目录或文件 - 注意路径末尾斜杠:
/src/(同步内容)和/src(同步目录本身)行为不同,--dry-run输出会体现这点 - 如果目标是远程主机,先确认远程 rsync 版本是否支持
--dry-run(2.6.4+ 都支持,但极老版本可能忽略该参数)
二、误删发生后的紧急响应步骤
一旦发现 --delete 已执行且重要文件消失,立刻停止所有对目标目录的写入操作,避免新数据覆盖已删除文件的磁盘空间。
- 如果是本地目录:立即卸载所在文件系统(如
umount /mnt/data),或至少禁止任何进程写入该分区 - 如果是远程服务器上的目录:登录后第一时间停掉相关服务(如 web server、db、定时任务),并检查
lsof +D /path/to/deleted—— 如果有进程还打开着已被删的文件,/proc/PID/fd/下仍可找回 - 不要运行
rsync反向同步、不要cp -r覆盖、不要格式化或重建文件系统 - 快速确认是否有现成备份(见下节),没有就立刻启动文件恢复工具(如
extundelete、photorec、debugfs),但成功率取决于文件系统类型和后续写入量
三、可靠的备份 + 恢复流程设计
靠恢复工具是下策,上策是建立带校验、带保留策略的 rsync 备份体系,让误删可逆。
- 每次 rsync 同步前,先用硬链接创建快照(推荐
rsnapshot或手动用cp -al):cp -al backup.0/ backup.1/ && rsync -a --delete /src/ backup.0/ - 在目标端保留多份历史副本(如 daily.0 ~ daily.7),每份都是完整目录结构,不依赖增量差异
- 备份命令中加上
--backup --backup-dir=... --suffix=...可单独保存被删文件(适合小规模变更场景) - 定期验证备份完整性:用
rsync -avn对比源与最新备份;对关键目录跑sha256sum -c校验清单 - 恢复时不要直接覆盖生产目录,先
rsync -a backup.3/ /restore_test/检查内容,确认无误再切换
真正安全的 rsync 流程,不是靠一次命令不出错,而是让每一次“出错”都落在可回退的边界内。备份不是附加项,它是 --delete 的必要搭档。










