27

rsync チェックサムに関するスレッドはたくさんありますが、少なくとも私の場合は、同期するための最も効果的で最速の方法であるこのニーズに対処しているようには見えません。

  • 同時に同じサイズ ► ファイルをスキップ (転送なし、チェックサムなし)
  • 異なるサイズ ► 転送ファイル (チェックサムなし)
  • 異なる時間と同じサイズ ► チェックサムを実行 ► チェックサムが異なる場合のみ転送

--checksum多くのファイルがある場合、このオプションを使用すると、フォルダーをミラーリングするのに非常に時間がかかることに気付きました。このオプションを単独で使用すると、すべてのファイルでチェックサムが実行されます。これは非常に安全ですが、非常に遅くなります。さらに、チェックサムを計算するために読み取りアクセスのオーバーヘッドが発生します。
オプション--ignore-timesは私が望むものではありません。時間とサイズの両方が一致する場合、ファイルが異なる可能性はわずかです。転送しないというリスクを冒しても構わないと思っています。サイズが同じで時刻が異なるファイルが実際には異なるファイルである可能性が高いため、
このオプションは不完全です (たとえば、別の文字を変更してもサイズには影響せず、編集の時刻だけが影響を受ける可能性があります)。--size-only

上記の組み合わせに従ってミラーリングを実行する方法はありますか?
ありがとう。

4

2 に答える 2

24

ファイルを転送するかどうか (または、--dry-runファイルを一覧表示するかどうか) を決定するとき、rsync は常にファイルサイズが異なるファイルを転送します。ただし、ファイルが同じサイズの場合、rsync にはいくつかのオプションがあります。

  • with --size-only: ファイルを転送しない
  • with --ignore-times: 常にファイルを転送する
  • デフォルト: タイムスタンプが異なる場合、ファイルを転送します
  • with --checksum: チェックサムを計算し、ファイルが異なる場合はファイルを転送します

必要な動作は、最後の 2 つの組み合わせです。「タイムスタンプが異なる場合は、チェックサムを計算し、チェックサムも異なる場合はファイルを転送します」。これは現在 rsync のオプションではありません。

残念ながら、rsync のソースコードを見ると、この機能を追加するのは簡単ではないようです。現在、チェックサムが使用されている場合、リモート rsync はサイズ、タイムスタンプ、およびチェックサム情報を収集し、それらをまとめて送信します。望ましい動作では、リモート rsync が最初にサイズとタイムスタンプを送信し、ローカル rsync がチェックサムが必要であると判断すると、ファイルに戻ってチェックサムを取得する必要があります。しかし、「リモート rsync がファイルに戻る」という側面全体は現在のコードには存在せず、最初に記述する必要があります。

実際の転送を実行すると、転送プロセス中に 2 番目のステップを効果的に実行できます。違いのないファイルの転送は非常に効率的です。したがって、rsync のデフォルトの動作で十分です。最良のアプローチを使用--dry-runする場合、おそらく最初にデフォルトの動作で rsync を実行し、出力を収集してから、最初の実行で見つかったファイルに対して を使用して--dry-runrsync を再度実行します。--checksum

于 2014-05-17T23:35:47.693 に答える
4

簡単な答えは...そうです。

same time and same size ► skip file (no transfer, no checksum)

適切で高速ですが、正確ではありませんが、rsync はデフォルトでそれを提供します。ファイルは変更される可能性があり、時間/サイズは同じままです。(時間はリセットできます) 偏執症の場合は -c を使用できます。

different sizes ► transfer file (no checksum)

単純化して... 2 GB のファイルだとしたら... 最後の 1 行が違うだけでしょうか? チェックサムはそれを把握し、ネットワーク トラフィックを節約できます。時間/サイズの比較を信頼する場合は、-c を使用できます。

different times and same size ► perform checksum ► transfer only if checksums differ

もちろん。


見えませんが、rsync に問題があったことを覚えています。多分その問題は修正されました。
1 つのディレクトリに多くのファイルがある場合は、おそらくより大きな問題が発生します...それらを異なるディレクトリに分散させ、それらの複数のディレクトリで複数の rsync を実行します。
多くの小さなファイル (ほとんどのファイルシステム上) には多くの内部フラグメンテーションの問題があり、ファイルをアーカイブしてアーカイブを再同期した方がよい場合があります... アーカイブを常に再作成するのではなく、更新できるアーカイバが必要です.

おそらく、これらのファイルの多くが更新されていない場合...日付の後に変更されたファイルを見つけて(--newerファイルを見つける)、それらのファイルだけをrsyncします。(時代を信じれば)

なぜこの質問は長い間無視されてきたのですか?

于 2013-12-12T04:54:42.120 に答える