回答:
次のアプローチを試すことができます:scpの代わりにddを使用して、ダウンロードされた部分をスキップし、残りをファイルに追加します。
sofar=`ls -l ./destfile | awk '{print $5}'`
ssh rsys "dd if=./srcfile bs=1 skip=$sofar" >> ./destfile
可能な最適化:大きなブロックで作業します。これは宿題のままにしておきましょう。
dd
小さなブロックサイズでは、遅くなる可能性があります(ここではわずか350 kB /秒)。幸い、scp
転送は1024バイトブロックで行われるようです。そうである場合(または、ファイルを最も近い1024バイトブロックに切り捨てることにより)、次のように高速化できますssh rsys "dd if=./srcfile bs=1024 skip=$sofar" >> ./destfile
。(その$sofar
場合、スキップするには1024バイトブロックの数でなければなりません!)
rsys
2行目は単なるホスト名の例であり、の特別な引数ではないことを理解するのに少し時間がかかりましたssh
。user@host
混乱を避けるために置き換えることをお勧めします。
はい、中断した時点から再開する方法はありますが、scpを使用することはできません。sftp reget filename
必要なことを行います。YarekとGrawityは、私が両方に+1する有効なソリューションを提供していますが、中断したところから再開するには、rsyncが好きです。どちらの例のコマンドも、リモートサーバーからローカルワークステーションにファイルを取得(ダウンロード)していることを前提としています。最後の2つのパラメータは、この順序でsource_fileとtarget_fileと見なす必要があることに注意してください。ファイル名の構文は、ソースファイルとターゲットファイルのどちらがローカルかリモートかによって異なります。[テキスト]ファイルを送信(アップロード)する場合、提供される例を次のように書き換えます。
#ローカルからリモートへ sofar = `ssh remote_system ls -l interrupted_file | awk '{print $ 5}' `; dd if = source_file bs = 1 skip = $ sofar | ssh remote_system "cat >> ./interrupted_file"
そして、rsyncソリューションに、を追加し-e ssh
ます。冗長性、圧縮、所有権の保持、権限、タイムスタンプ、再帰ディレクトリなどが必要かどうかを検討する必要があります。-Lパラメータについては、manページとgoogleを確認してください。シンボリックリンクを参照するのではなく、リンクとして残したい場合があります。
rsync -P -e ssh local_source_file remoteserver:path/to/interrupted_target_file
scp -o ConnectTimeout 60
接続のタイムアウトを指定できます。接続が切断されないようにすることができます。