rsyncによる単一ファイルの転送を再開します


52

Ubuntuでは、ハードドライブからリムーバブルドライブに大きなファイルをコピーしますrsync。他の何らかの理由で、1回の実行で操作を完了できません。だからrsync、前回中断したところからファイルのコピーを再開する方法を見つけようとしています。

私はオプション--partialまたはを使用しようとしましたが、と--inplace一緒に--progress、最後に残ったものからではなく、実際に最初から見つかったrsync--partialまたは--inplace最初から始まります。手動でrsync早期に停止し、受信したファイルのサイズを確認することでも、私が見つけたことを確認しました。

しかし--append、rsyncは前回残ったものから始まります。

manページ --partial--inplaceで見たように混乱しており、--append前回残ったものからコピーを再開することに関連しているようです。誰かが違いを説明できますか?なぜない--partialか、--inplaceコピーを再開するための仕事?コピーを再開するためにrsync--appendオプションを使用する必要があるのは本当ですか?

また、rsyncではなくmvまたはによって部分的なファイルが残された場合cprsync --appendファイルのコピーを正しく再開しますか?

回答:


39

中断されたコピーを再開するには、を使用する必要がありますrsync --append。のmanページの説明から--append

これにより、rsyncはファイルの末尾にデータを追加してファイルを更新します。これ は、受信側にすでに存在するデータが送信側のファイルの先頭と同一であると仮定します。 [...]暗示する--inplace、[...]

オプション--inplacersync、宛先ファイルの内容を直接(上書き)上書きします。なしで --inplacersync

  1. 一時的な名前で新しいファイルを作成し、
  2. 更新されたコンテンツをそれにコピーし、
  3. 宛先ファイルと交換し、最後に
  4. 宛先ファイルの古いコピーを削除します。

通常の動作モードでは、主に宛先ファイルが開かれている可能性のあるアプリケーションとの競合や、rsyncマンページに正式にリストされている他のいくつかの事故を防ぎます。

手順1〜3でコピー/更新操作が失敗した場合は、注意してください。上記の場合 rsync、一時的な宛先ファイルが削除されます。--partial オプションは、この動作を無効にし、rsync先のファイルシステム上に部分的に転送された一時ファイルを残します。したがって、1つ目のファイルコピー操作を再開しても、最初のrsyncwith --partialまたは withと--partial-dir同じ効果が得られない限り、それほど効果はありません(--partialさらにrsync 、特定のディレクトリにすべての一時ファイルを作成するよう指示します)。


ありがとう!部分的なファイルがrsyncではなくmvまたはcpによって残された場合、rsync --appendはファイルのコピーを正しく再開しますか?
ティム

1
@Timでの短い、--append作るにはrsync2つの、対応するファイルが異なる長さを持っている場合は、と信じて、その後、短い方が長い方の最初の部分と同じです。そのため、大きなファイルのコピーを開始しcp、コピープロセスを中断するrsync --appendと、ファイルの残りの部分のみがコピーされます。(注:場合はcp、システムのクラッシュによって中断され、ファイルの内容とメタデータが同期していないことを小さなチャンス、すなわち、ファイルが破損しているこの場合、実行されているがあります。rsyncもう一度ずに --append問題を修正する必要がありますが。)
リッカルドムリ

2
したがって、これを正しく理解している場合、rsyncに部分的なファイル検証し、その部分的に転送されたファイルへの転送を再開するように指示する方法はありませんか?
ウィニー14

1
@Winny、非常に遅れて:ローカルコピーの場合、これを行う賢明な方法はありません。ネットワークコピーの場合、これはを指定し--partialない場合のデフォルトモードです--append
ロアイマ

1
@Winny --appendおよび--append-verify危険な障害の場合:受信者のファイルが同じサイズ以上で、データが異なる場合。代わりに解決策--no-whole-fileを提案します
トム・ヘイル

21

それが意味する--appendこと--inplaceに注意してください--partial

  • 使用--partialするだけで、rsync部分的な転送を残して、後続の試行でそれらを再開する必要があります。

  • を使用--appendするrsyncことで、部分的なファイルを残して、次回にそれらを再開する必要があります。転送後rsyncは、送信されたデータのチェックサムのみを確認する必要があります。

  • --append-verify 以前の転送で転送された部分を含む、チェックサム検証にファイル全体を含めます。

  • チェックサム検証のいずれか--appendまたは--append-verify失敗により、ファイルが完全に再送信されます(を使用--inplace

mvまたはでcp操作を再開できるはずrsyncですが--append-verify、安心してオプションを使用することもできます。

使用する--appendと、受信側のサイズが送信側のサイズよりも短いファイル(タイムスタンプに関係なく)、または受信側にないファイルのみrsyncがコピーされることに注意してください。このオプションに関するドキュメント:

ファイルを転送する必要があり、受信側のサイズが送信側のサイズと同じかそれより長い場合、ファイルはスキップされます。

マニュアルページの詳細


--appendそして、--append-verify危険な障害ケースを持っている:受信者のファイルが同じサイズ以上であるが、異なるデータを持っている場合。代わりに解決策--no-whole-fileを提案します
トム・ヘイル

@TomHaleのドキュメントでは、ファイルをスキップするには、両端でサイズと修正時間がまったく同じである必要があると示唆されています。これがもっともらしい懸念である場合は、--checksum使用する必要があります。明示的に指定されていることはわかりませんが、論理的には、再開可能なオプションは互換性がない--no-whole-fileため暗黙的に指定する--whole-file必要があります。
TomG

--append-verify日付が異なる「同じ」またはサイズの大きいファイルスキップします。これは「予期しない」場合があります。とにかくファイル全体のチェックサムを行うように、--checksum すべてのファイルを必要とするわけでrsyncはありませんが、それが転送するものについてのみです。
トムヘイル

--checksum伝えrsyncファイルをチェックサムする前に、すべての変更されたファイルは、サイズに関係なく/時間の、転送されていることを保証する送信。--append-verify説明した内容がドキュメントまたは私の(限られた)経験と一致しないため、予期しない動作の原因はありますか?
TomG

--append-verifyを参照し--appendます:のIf a file needs to be transferred and its size on the receiver is the same or longer than the size on the sender, the file is skipped.ためにファイルを転送する必要がある--checksum場合でも、スキップされる可能性があります。
トムヘイル

6

デビッド・シュワルツは正しいです--partial(または、より良い-P)あなたが望むことをします。これを、ネットワーク経由で〜8gに停止された37Gファイルで検証しました。rsyncは、パーシャルの最初の部分をすばやくスキャンし(おかげで進行状況を表示-P)、パーシャルファイルの最後まで転送を再開しました。


ネットワークコピーは、ここでの問題であるローカルコピーとは異なる方法で処理されます。
ロアイマ

@roaimaそのためのソース、または違いが何であるかをより詳細に説明するドキュメントはありますか?(巨大な)マンページで見つけることができません。
ジョナスシェーファー

下のそれに@JonasWielicki manページをほのめかしている--whole-fileオプションの説明。
ロアイマ

@roaimaありがとうございます!これは、適切な回避策が--no-W(実際に機能している!)
ジョナスシェーファー

@JonasWielickiは非常に非効率的であるため、デフォルトでは無効になっています。--no-Wローカルファイルの設定が何を意味するのかを正確に理解しない限り、本当に使用したくないでしょう。unix.stackexchange.com/a/181018/100397
roaima

2

あなたはそれを正しくやって--partialいて、あなたが望むことをします。常にコピーする必要があるファイルデータチャンクのリストの先頭から開始するため、最初から開始しているように見えます。この--appendオプションは危険であり、何らかの理由でデータが一致しない場合、ファイルが破損します。


ローカルコピーは比較されず、単に上書きされます(または--appendバイトオフセットから継続されます)。
ロアイマ

1

デフォルトでrsync--whole-file、ローカルディスクからローカルディスクに転送する場合に有効になります。これにより、既に存在する部分をチェックするのではなく、中断された転送が最初から再開されます。

これを無効にするには、次を使用します。

--no-whole-file

これをいずれ--inplace--partialと組み合わせると、後で転送を再開できます。

rsyncコピーに使用するための私のエイリアスは次のとおりです。

rscp='rsync -ax --inplace --sparse --no-whole-file --protect-args'

警告:同じサイズ以上の宛先ファイルをスキップするため、使用には注意し--append-verifyてください。


ネットワーク転送では、転送rsync前にソースファイルと対応する宛先ファイルを比較して、変更された部分のみを送信します(デルタ転送)。ローカルからローカルへのコピーに対して同じことを行う--no-whole-fileように指示rsyncします。ドキュメントは、単一ファイルの部分的な転送の再開に影響があることを示唆していません。 rsync設計上、まったく同じサイズとタイムスタンプを持つファイルをスキップします。その動作はどちら--append-verify--no-whole-file変更すべきではありませんが--checksum、ディスクIOを犠牲にして安心して動作するはずです
TomG

--append-verify日付が異なる「同じ」またはサイズの大きいファイルスキップします。これは「予期しない」場合があります。とにかくファイル全体のチェックサムを行うように、--checksum すべてのファイルを必要とするわけでrsyncはありませんが、それが転送するものについてのみです。
トムヘイル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.