DEBUG.WIKI
京东云;让 AI 进入真实业务;零售 · 物流 · 客服 · 硬件;查看方案 →
ZgoCloud:多地区部署,按需选节点;日本、美国、香港、德国
Evoxt;最高 6.0GHz CPU;高频云服务器 · 免费每周备份;查看配置 →

rsync 多复制了一层目录:源路径末尾斜杠与已有目标目录

rsync 同步后多出一层同名目录,核对源路径末尾斜杠、已有目标目录和预演结果,再处理误覆盖与旧目录。

打算把 project 里的文件同步到备份目录,执行 rsync 后却得到 backups/project/project/,通常需要先检查源路径末尾有没有 /。当目标已经是目录时,/srv/project 表示复制这个目录,/srv/project/ 表示复制它的内容,两者会形成不同的目标层级。

下面讨论 Linux 上常见的 rsync 本地目录同步。远端路径同样要确认含义,但只有一个源、目标尚不存在等情形,还会影响最终名称,不能只看一处斜杠就断定结果。

先明确源目录与已有目标

以下是路径布局示例,假设 /srv/backups/project/ 已经存在:

源文件:/srv/project/settings.ini
目标目录:/srv/backups/project/

把 /srv/project 复制到这个目录,文件会位于 /srv/backups/project/project/settings.ini;把 /srv/project/ 的内容复制过去,文件会位于 /srv/backups/project/settings.ini。这是源目录与内容的区别,给目标末尾补一个斜杠不会替你改变源路径的含义。

核对实际挂载点和拼写后再处理。如果两个路径看似相同,实际指向了不同磁盘或写错了一个字符,修改斜杠无法修正目标位置。目标是否已存在也要确认:不要把上述结果直接套到不存在的目标路径上。

用预演确认文件落在哪一层

先用只预演的命令检查,下面路径均需替换为自己的目录:

rsync -ani -- /srv/project/ /srv/backups/project/

-n 不实际同步,-i 显示计划变更;-a 使用归档模式。重点看相对文件名是否是 settings.ini,以及目标是否确实指向预定的备份目录。如果仍看到 project/settings.ini,要检查是否用了无斜杠的源目录,或源中本来就有同名子目录。

同时确认已有同名文件是否会被覆盖、权限和时间等属性是否会被调整。归档模式会尝试保留多种属性,实际能否保留所有者和组还受执行用户权限限制。需要稳定备份的应用数据,应先取得一致的快照或按应用要求暂停写入;预演和正式同步之间,源文件仍可能变化。

确认目标数据已有可恢复的备份、预演范围正确后,才移除 -n:

rsync -ai -- /srv/project/ /srv/backups/project/

这条命令仍可能覆盖目标同名文件。先记录原参数和备份位置,出现误覆盖时从同步前的备份恢复;调整路径不能自动撤销已经发生的写入。

已多出一层目录,别急着加 --delete

第一次同步产生的 project/ 子目录,不会因为第二次改对源路径而自动迁移或消失。先比较两层目录的数据,确认其中是否有独有文件,再决定保留、迁移或清理。不要为了整理目录直接把旧层级当成无用内容删除。

--delete 会删除接收端同步范围内、发送端不存在的内容,斜杠改变了同步范围时尤其需要重新审核。若目标还放着手动保存的文件,这些文件也可能进入删除范围。只为修正目录层级时,可以先使用不带 --delete 的同步;确实需要镜像删除时,另做备份,并带 -n 预演原定删除参数,逐项确认。

修正后,应检查几个已知文件的完整目标路径、内容和必要的元数据,确认没有意外新增层级或遗失目标独有文件。随后用相同源、目标和选项再预演;在源稳定的前提下,已同步文件不应反复出现同样的变更。