命令

从B实例的数据拷贝到A实例,即B的实例数据是对的

1
rsync -avzP -e "ssh -p B实例端口" root@B实例域名:B实例数据绝对路径/ A实例数据绝对路径/

📋 实战命令模版

假设你的项目和数据存放在 /root/autodl-tmp/my_project/

Bash

1
2
3
4
rsync -avzP -e "ssh -p 32145" root@region-1.autodl.com:/root/autodl-tmp/my_project/ /root/autodl-tmp/my_project/
# 如果直接拷贝autodl-tmp就目录选择到这里就行
#示例:若B实例的登录指令复制为:ssh -p 15407 root@connect.westb.seetacloud.com,则填为下面这样
rsync -avzP -e "ssh -p 15407" root@connect.westb.seetacloud.com:/root/autodl-tmp/ /root/autodl-tmp/

🔍 参数深度解析

参数 作用说明
-a (archive) 归档模式。保持文件的所有属性(权限、时间戳、软链接等)不改变。
-v (verbose) 详细模式。在终端打印当前正在传输的文件列表和进度。
-z (compress) 传输时压缩。在网络传输过程中对数据进行压缩,节省带宽,提高传输速度。
-P (progress) 显示实时传输进度条,并支持断点续传(对大文件非常重要)。
-e "ssh -p ..." 指定远程连接使用的协议和非标准端口(AutoDL 必须指定端口)。

⚠️ 避坑指南:必须注意的「斜杠 /」细节

rsync 对路径末尾的斜杠 / 极其敏感,不同的写法会导致完全不同的结果:

  1. 正确写法(推荐):源路径和目标路径末尾都带斜杠
    • 示例:...:/root/project/ /root/project/
    • 效果:将 B 实例 project 目录内部的内容,同步到 A 实例的 project 目录内部。
  2. 错误写法:源路径末尾不带斜杠
    • 示例:...:/root/project /root/project/
    • 效果:会在 A 实例的 project 目录下再创建一个 project 目录,变成了 /root/project/project/

🚀 高级进阶技巧

1. 排除特定目录(不全量同步)

如果你不想同步 weights/(权重文件)或 dataset/(原始数据集,因为已经有了),只想同步代码和日志,可以使用 --exclude 参数:

Bash

1
rsync -avzP --exclude="dataset/" --exclude="*.mp4" -e "ssh -p 32145" root@region-1.autodl.com:/root/autodl-tmp/my_project/ /root/autodl-tmp/my_project/

2. 双向完全对齐(谨慎使用)

如果 B 实例中删除了某些没用的临时文件,你希望 A 实例也跟着删除,保持完全一致,可以加上 --delete 参数。

  • 警告:这会删除 A 实例中存在但 B 实例中没有的文件,执行前请务必确认!

Bash

1
rsync -avzP --delete -e "ssh -p 32145" root@region-1.autodl.com:/root/autodl-tmp/my_project/ /root/autodl-tmp/my_project/

3. 一键同步脚本

为了避免每次手动输入长命令,你可以在 A 实例的根目录下创建一个脚本 sync_from_b.sh

Bash

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
# 自动生成的 AutoDL 增量同步脚本

B_PORT="32145"
B_HOST="region-1.autodl.com"
SRC_DIR="/root/autodl-tmp/my_project/"
DST_DIR="/root/autodl-tmp/my_project/"

echo "开始从实例 B (${B_HOST}:${B_PORT}) 增量同步数据..."
rsync -avzP -e "ssh -p ${B_PORT}" root@${B_HOST}:${SRC_DIR} ${DST_DIR}
echo "同步完成!"

给脚本赋予执行权限:chmod +x sync_from_b.sh。下次直接运行 ./sync_from_b.sh 即可。