本地镜像同步需用 rsync -a --delete /src/ /dst/,末尾斜杠决定是否嵌套目录;--delete 确保目标严格等于源状态;执行前须验证路径存在并用 -n 测试。

本地镜像同步两份目录,核心就一条命令:rsync -a --delete,但末尾斜杠 / 的有无直接决定行为逻辑——这是最容易出错的地方。
rsync -a --delete /src/ /dst/ 和 /src 和 /dst 的区别
关键在源路径结尾是否带 /:
-
rsync -a --delete /src/ /dst/:把/src/里所有内容(不含/src自身)复制进/dst/,效果是/dst/成为/src/的镜像 -
rsync -a --delete /src /dst/:把整个/src目录(含目录名)复制到/dst/下,结果是/dst/src/——这不是镜像,是嵌套
绝大多数本地镜像需求要的是第一种。漏掉 / 就会多出一层目录,且 --delete 会误删 /dst/ 下原有同名文件(比如你本想镜像到 /backup,结果却删了 /backup 里其他项目)。
为什么必须加 --delete 才算“镜像”
不加 --delete 的 rsync -a 只做单向增量更新:新增和修改的文件会被同步,但源里已删除的文件,目标里还留着——这叫“同步”,不是“镜像”。
--delete 的作用是让目标严格等于源的当前状态:
- 源里有的文件 → 目标里必须有(含内容、权限、时间戳)
- 源里没有的文件 → 目标里必须删掉
- 执行前建议先用
rsync -an --delete /src/ /dst/测试(-n表示 dry-run,只显示将删/将传哪些文件,不真操作)
实际使用时要注意的三个兼容性细节
本地同步看似简单,但这些点常被忽略:
- 目标目录
/dst/必须存在,rsync不会自动创建它;如果不存在,会报错rsync: failed to open log file: No such file or directory或直接失败 -
-a已隐含-r(递归)、-t(保留时间戳)、-p(权限)、-o(属主)、-g(属组),但不会保留 ACL 或扩展属性(需额外加-X或-A) - 若源或目标路径含空格或特殊字符,务必用引号包裹,例如:
rsync -a --delete "/my folder/" "/backup folder/"
一个安全的本地镜像同步工作流
别一上来就跑带 --delete 的命令:
- 第一步:确认源和目标路径正确,且目标目录已存在
- 第二步:运行测试命令
rsync -avn --delete /src/ /dst/,检查输出是否符合预期(特别是将被删除的文件列表) - 第三步:确认无误后,去掉
n,执行rsync -av --delete /src/ /dst/ - 第四步:用
diff -r /src/ /dst/快速验证一致性(注意diff对硬链接、设备文件等可能报错,仅作快速抽检)
真正麻烦的不是命令本身,而是 / 的位置、--delete 的副作用、以及目标目录是否存在这三个点——它们组合起来,足以让一次“镜像”变成数据丢失事故。











