scp转移数据
Published:
TL;DR: This post explains how to use scp
to transfer data between servers, detailing its behavior when copying directories and handling existing files.
scp转移数据
# on 77
cd /data1/linkdom
scp -r .cache liuchi@10.1.114.75:/data2/linkdom
使用 scp
复制本地目录到目标服务器时,如果目标目录已存在,其行为如下:
覆盖同名文件:
目标目录中与源目录同名的文件会被覆盖(无论内容是否更改)。例如,若本地的zero/a.txt
有修改,远程的zero/a.txt
会被替换为本地的版本。新增文件:
源目录中新增的文件会被添加到目标目录中。例如,本地新增的zero/c.txt
会被复制到远程目录。保留目标独有文件:
目标目录中存在但源目录中没有的文件不会被删除。例如,远程的zero/d.txt
和zero/e.txt
会保留,不会被移除。不处理源删除的文件:
如果源目录删除了某些文件(如原zero/d.txt
),这些文件在目标目录中仍然存在,不会被自动删除。
示例场景
本地
zero
目录内容:
a.txt
(已修改)、b.txt
、c.txt
(新增)远程
zero
目录原内容:
a.txt
(旧版)、b.txt
、d.txt
、e.txt
执行
scp -r zero user@remote:/path
后:
远程目录内容变为:
a.txt
(新版)、b.txt
、c.txt
(新增)、d.txt
(保留)、e.txt
(保留)
注意事项
覆盖机制:
scp
直接覆盖同名文件,不会检查内容差异,仅根据路径和文件名判断。元数据更新:
文件的时间戳等元数据可能被更新,取决于scp
的实现。同步建议:
如果需要完全同步(包括删除目标多余文件),应使用rsync
命令,例如:rsync -avh --delete /local/zero/ user@remote:/path/zero/
(
--delete
选项会删除目标中存在但源中没有的文件)
[!tldr] 总结
scp
的目录复制是“合并”而非“替换”。它覆盖同名文件并添加新文件,但不会删除目标中独有的文件。若需精确同步,建议使用rsync
。但是其实
scp
也存在缺点,比如在复制软链接的时候会直接用scp
的方式复制过去,而不是软链接过去,这样会导致目标服务器的文件占用空间过大。自己在实际中迁移 huggingface
.cache
发现就是比原来的文件夹大了一倍,其原因就是因为.cache/huggingface/hub/
下的每个模型,本来是blobs
存的模型的权重,snapshots
存的是每个模型权重的一系列软链接,和发布在huggingface上保持一致的软链接,在迁移到目标服务器后发现全部被实际的权重文件替代了。