scp递归复制Svelte构建目录时部分文件及目录丢失的问题求助
兄弟,我碰到过类似的scp递归复制漏文件的情况,咱们一步步来排查原因和解决办法:
可能的原因及对应解决方法
1. 路径写法导致的内容遗漏
你用的是scp -r ./build user@remote.host:~/directory,这会把整个build目录复制到远程的~/directory下面,变成~/directory/build。如果你是想把build里的内容直接放到~/directory里,那应该改成:
scp -r ./build/. user@remote.host:~/directory
这种写法会把build下的所有内容(包括隐藏文件/目录)都复制到目标目录,有时候路径的小差异会让人误以为是文件丢失了。
2. 文件权限问题
如果本地的play目录或者里面的文件没有可读权限,scp在复制的时候会悄悄跳过它们,而且verbose模式下的提示可能很不起眼。你再跑一遍带-v的命令:
scp -rv ./build user@remote.host:~/directory
仔细看输出,有没有出现permission denied或者skipping的字样,尤其是针对play目录的。如果是权限问题,先在本地给目录加可读权限:
chmod -R u+r ./build/play
然后重新复制。
3. 符号链接的坑
如果play目录是个符号链接,scp默认只会复制链接本身,不会跟随链接去复制实际的目录内容。如果你需要复制链接指向的真实内容,要加上-L参数:
scp -rL ./build user@remote.host:~/directory
4. 网络不稳定导致中断
scp在复制大量文件或者大文件时,如果网络偶尔断一下,可能会直接停止复制,后面的文件就漏了。这种情况下,用rsync替代scp会更靠谱,它支持断点续传,还能对比本地和远程的文件只传差异:
rsync -avz ./build/ user@remote.host:~/directory/
-a是归档模式,包含递归、保留权限等所有必要属性;-v是verbose输出;-z是压缩传输,速度更快。而且下次更新构建目录时,rsync只会传改动的部分,效率高很多。
5. 远程磁盘空间不足
如果远程服务器的目标目录所在磁盘满了,scp会停止复制,后面的文件自然就没传过去。你登录远程服务器后,用这个命令看看空间情况:
df -h ~/directory
如果空间不足,清理一下冗余文件再重新复制。
快速排查步骤
- 先确认本地
build目录下的play等内容确实存在,用ls -la ./build检查; - 对比远程目录的内容,看是整个目录没过去还是部分文件;
- 用
scp -rv跑一遍,仔细看输出找错误提示; - 优先试试rsync替代scp,大概率能解决问题。
备注:内容来源于stack exchange,提问作者Phishy1

