rsyncがすでに最新のファイルをコピーしようとしているのはなぜですか?

rsyncがすでに最新のファイルをコピーしようとしているのはなぜですか?

私のローカルコンピュータとリモートコンピュータには2つの同じファイルがあります。サイズは同じで、ローカルシステムのファイルはリモートシステムのファイルよりも最新ですが、rsyncはまだファイルのコピーを試みます。

次のようにrsyncを呼び出します。

rsync -nv -e "ssh -p 2222" user@host:/data/file.fif data/file.fif

-n(オプションを使用しないとコピー操作が開始されます)

Rsyncのドキュメントには、このようなことは起こらないことが明確に記載されています。

Rsync  finds files that need to be transferred using a "quick check" algorithm (by default) that looks for files that have changed in size or in last-modified time.

出力stat

# remote file
  File: `data/fif/Skovorodko_Olga_45_raw.fif'
  Size: 1137551966  Blocks: 2221784    IO Block: 4096   regular file
Device: fd00h/64768d    Inode: 286338      Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1037/  platon)   Gid: ( 1047/  platon)
Access: 2013-08-08 18:40:16.907581658 +0400
Modify: 2013-07-16 12:01:09.158763284 +0400
Change: 2013-07-16 12:01:09.158763284 +0400

# local file
  File: `data/fif/Skovorodko_Olga_45_raw.fif'
  Size: 1137551966  Blocks: 2221792    IO Block: 4096   regular file
Device: 801h/2049d  Inode: 12987232    Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1005/  platon)   Gid: ( 1003/  platon)
Access: 2013-08-08 19:02:57.146223369 +0400
Modify: 2013-08-08 19:02:57.146223369 +0400
Change: 2013-08-08 19:02:57.146223369 +0400

なぜこれが起こるのですか?

修正する:

実行rsync --size-only結果ファイルはコピーされません。

delta-transmission enabled
Skovorodko_Olga_45_raw.fif is uptodate
total: matches=0  hash_hits=0  false_alarms=0 data=0

sent 14 bytes  received 114 bytes  85.33 bytes/sec
total size is 1137551966  speedup is 8887124.73 (DRY RUN)

答え1

クイックチェックアルゴリズムは、変更時間またはサイズが異なるすべてのファイルを変更されたと見なします。したがって、ターゲットディレクトリに同じファイルの最新バージョンがある場合は、別のバージョンと見なされ、ソースバージョンと同期されます。

これは予想される(そしてより安全な)動作です。たとえば、 ~/src と ~/dest という 2 つのディレクトリがあり、それぞれ foobar ファイルがあるとします。 ~/src/foobar に「foo」を、 ~/dest/foobar に「bar」を書き込みます。ここで、~/src を ~/dest に同期します。何を期待しますか?

両方のファイルのサイズは同じですが、〜/destのファイルはより最新です。 Rsync の標準動作は ~/dest/foobar を ~/src/foobar に置き換えることです。もちろん、ファイルが同じかもしれないので不要なことですが、チェックサムやビットごとの比較を行わないと、これを知る方法はありません。

この動作を望まない場合、つまり受信者に最新のファイルを保持したい場合は、-u(--update)フラグを使用する必要があります。

-u、--updateこれは、rsyncがターゲットに存在し、ソースファイルよりも変更時間が最新のすべてのファイルをスキップします。 (既存のファイルの変更時間が元のファイルと同じ場合、サイズが異なるとファイルが更新されます。)

関連情報