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


24

ローカルマシンとリモートマシンに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)

回答:


37

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

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

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

その動作が望ましくない場合、つまり、レシーバーの新しいファイルを保持したい場合は、-u(--update)フラグを使用する必要があります。

-u、-updateこれにより、rsyncは、宛先に存在し、ソースファイルより新しい修正時刻を持つファイルをスキップします。(既存の宛先ファイルの変更時間がソースファイルと同じ場合、サイズが異なる場合は更新されます。)


2
はい、それは確かに問題でした。-tフラグを追加するのを忘れたため、新しいファイルに適切な変更時間を設定しておらず、後続のrsync呼び出しで新しいファイルを更新しようとしていました。ありがとう!
Rogach

13
@Rogach正当rsync -aな理由がない限り、常に使用してください。
ジル「SO-悪であるのをやめる」

私はOPの同じ問題を抱えてい-aましたが、この場合は別の問題、すなわちエラーにつながりますskipping directory .。原因は-a含まれて-rいたので、フォルダ内にディレクトリがない場合はエラーになります。このブログ投稿で
カルダモン

@cardamomは引き続き-aデフォルトで使用し、必要のないオプションを--no-プレフィックスで明示的に無効にします。あなたの場合はそうでしょうrsync -a --no-r
ウォルフ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.