我正在使用scp
shell命令复制大量文件夹中的文件。
但是在某个时刻,我不得不终止运行中的命令(通过Ctrl+C或kill)。
据我所知,scp
按顺序复制文件,因此应该只有一个部分复制的文件。
如何恢复同一scp命令以不覆盖已成功复制的文件并正确处理部分复制的文件?
P.S. 我知道我可以在rsync中做这种事情,但是由于某些原因,scp对我来说更快,所以我使用它。
ssh
上的rsync
。rsync -P -e ssh remoteuser@remotehost:/remote/path /local/path
关键选项是-P
,它与--partial --progress
相同。
默认情况下,如果传输被中断,rsync将删除任何部分传输的文件。在某些情况下,保留部分传输的文件更为理想。使用--partial选项告诉rsync保留部分文件,这应该使得随后传输文件的其余部分更快。
其他选项,例如-a
(归档模式)和-z
(启用压缩)也可以使用。
-r
选项,你将会遇到“跳过目录.”的错误。参考来源:http://lucasb.eyer.be/snips/rsync-skipping-directory.html - Artur Czajkarsync -r -P -e 'ssh -J jumpuser@jumphost' /local/path remoteuser@remotehost:/remote/path
。 - xvan一种替代rsync的方法:
使用sftp
命令,加上-r
选项(递归复制整个目录)和sftp
的get
命令的-a
选项“继续传输部分已存在的文件”。
前提条件:您的sftp
实现已经具备了带有-a
选项的get
命令。
示例:
将远程服务器上的目录/foo/bar
复制到您本地的当前目录。目录bar
将在您的本地当前目录中创建。
echo "get -a /foo/bar" | sftp -r user@remote_server
echo "put -a foo/bar" | sftp -r server:/foo
。 - Carlos Rafael Ramirez自从OpenSSH 6.3版本以来,您可以在sftp
中使用reget
命令。
它与get
具有相同的语法,除了它会从现有本地文件的末尾开始传输。
echo "reget /file/path" | sftp -r user@server_name
使用get
命令的-a
开关或sftp
全局命令行的-a
开关可以产生相同的效果。
scp
。谢谢! - Adam Smooch当rsync在最初运行良好的几秒钟后也停滞不前时,我采用以下蛮力解决方案,每60秒开始、停止和重新启动下载:
cat run_me.sh
#!/bin/bash
while [ 1 ]
do
rsync --partial --progress --rsh=ssh user@host:/path/file.tgz file.tgz &
TASK_PID=$!
sleep 60
kill $TASK_PID
sleep 2
done
昨天我遇到了同样的问题,通过scp传输一个巨大的sql转储文件,幸运的是我用wget --continue the_url
解决了这个问题。
那篇博客文章讲得很清楚http://www.cyberciti.biz/tips/wget-resume-broken-download.html,基本上就是:
wget --continue url
dd
命令,并将其管道传输到ssh
:) - Mark Nunberg