web-dev-qa-db-ja.com

同じサイズのファイルに対してのみRsyncチェックサム

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

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

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

上記の組み合わせに従って、rsync(マンページで何かを見逃しましたか)または他のLinuxツールを使用してミラーリングを実行する方法はありますか?
ありがとう。

25
Sylvain

ファイルを転送するかどうか(または--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-run出力を収集してから、最初に見つかったファイルに対して--checksumを使用してrsyncを再度実行するのが最善の方法です。実行します。

19
MRV

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

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

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

different sizes ► transfer file (no checksum)

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

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

もちろん。


表示されませんが、rsyncが終わった場合に問題が発生したことを覚えています...約13万ファイルだったと思います。多分その問題は修正されました。
1つのディレクトリに非常に多くのファイルがある場合は、おそらくより大きな問題が発生します...それらを異なるディレクトリに分散し、それらの複数のディレクトリで複数のrsyncを実行します。
多くの小さなファイル(ほとんどのファイルシステム)には多くの内部断片化の問題があり、ファイルをアーカイブしてアーカイブを再同期する方が良いかもしれません...アーカイブを再更新するのではなく更新できるアーカイバが必要です。常にそれを作成します。

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

なぜこの質問はそんなに長く無視されたのですか?

5
9mjb