Rsyncは変更されたファイルのみをコピーします。ファイルの変更タイムスタンプは無視されます。

Rsyncは変更されたファイルのみをコピーします。ファイルの変更タイムスタンプは無視されます。

以下の条件下で rsync を動作させることはできますか?

if len(f1) != len(f2) then rsync
if len(f1) == len(f2) and md5sum(f1) != md5sum(f2) then rsync

一番近いのは--checksumオプションでしょうか?


答え1

マンページから引用rsync:

説明

Rsync は高速で非常に多用途なファイル コピー ツールです。ローカルでコピーしたり、リモート シェル経由で別のホストにコピーしたり、リモート rsync デーモンにコピーしたりできます。動作のあらゆる側面を制御する多数のオプションが用意されており、コピーするファイル セットを非常に柔軟に指定できます。デルタ転送アルゴリズムで有名で、ソース ファイルと宛先の既存ファイルの違いだけを送信することで、ネットワーク経由で送信されるデータの量を削減します。rsync は、バックアップやミラーリング、日常的に使用する改良されたコピー コマンドとして広く使用されています。

rsyncは、転送する必要があるファイルを、(デフォルトで)lqquick checkrqアルゴリズムを使用して見つけます。サイズまたは最終更新時刻が変更されたファイルを検索します。クイック チェックでファイルのデータを更新する必要がないことが示された場合、その他の保存属性 (オプションで要求される) の変更は、宛先ファイルに直接行われます。

したがって、説明にあるデフォルトの動作は次のようになります。

  • ローカルまたはリモートで動作するコピーツール
  • たくさんのオプション
  • デルタ転送アルゴリズムがデフォルトで、異なるファイルセットのみを転送し、ネットワーク使用量を削減します。
  • ミラーリングとバックアップに広く使用されているツール
  • 条件 1 で必要なことを実行する checkrq アルゴリズム: if len(f1) != len(f2) then rsync
  • オプションが渡されない場合、影響を受けるのは宛先です。

今は、チェックサムに関連するオプションを探すだけです。マニュアルで検索すると、

-c, --checksum
   This changes the way rsync checks if the files have been changed and are in
   need of a transfer. Without this option, rsync uses a lqquick checkrq that
   (by default) checks if each file's size and time of last modification match
   between the sender and receiver. This option changes this to compare a 128-
   bit checksum for each file that has a matching size. Generating the checksums
   means that both sides will expend a lot of disk I/O reading all the data in
   the files in the transfer (and this is prior to any reading that will be
   done to transfer changed files), so this can slow things down significantly.

の説明は、--checksumまさに に必要なものですif len(f1) == len(f2) and md5sum(f1) != md5sum(f2) then rsync。サイズが一致する各ファイルに対して 128 ビットのチェックサムを実行します。

ただし、このオプションは状況によっては I/O を大幅に増加させるので注意してください。

関連情報