Neden rsync güncel olan dosyayı kopyalamaya çalışıyor?


24

Yerel makinede ve uzaktaki makinede aynı iki dosya var. Boyutları eşittir ve yerel makinedeki dosya uzak olandan daha yeni - ancak rsync dosyayı kopyalamaya çalışıyor.

Rsync'i şu şekilde çağırdım:

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

( -nseçeneğini kullanmazsam , kopyalama işlemini başlatır)

Rsync docs, bunun olmaması gerektiğini açıkça belirtir:

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.

Çıktıları 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

Bu neden oluyor?

GÜNCELLEŞTİRME:

Doing rsync --size-onlysonuçları kopyalanan file not:

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)

Yanıtlar:


37

Hızlı kontrol algoritması, farklı değişiklik zamanları veya farklı büyüklükleri olan herhangi bir dosyayı değiştirilmiş olarak kabul edecektir. Bu nedenle, hedef dizininiz aynı dosyanın daha yeni bir sürümüne sahipse, farklı olarak kabul edilir ve kaynak sürümle senkronize edilir.

Beklenen (ve daha güvenli) davranış budur. Örneğin, her birinin bir foobar dosyası olan ~ / src ve ~ / dest adlı iki dizininiz olduğunu varsayalım. ~ / Src / foobar'da "foo" yazıyorsunuz ve sonra ~ / dest / foobar'da "bar" yazıyorsunuz. Şimdi ~ / src to ~ / dest. Ne beklersin?

Her iki dosya da aynı boyuta sahip ancak ~ / dest içindeki dosya daha yeni. Rsync standart davranışı ~ / dest / foobar'ı ~ / src / foobar ile değiştirmektir. Elbette, dosyalar aynı olabilir ve gereksiz olabilir, ancak bir sağlama toplamı yapmazsanız veya bit başına biti karşılaştırmazsanız bunu bilmenin bir yolu yoktur.

Bu davranışı istemiyorsanız, yani, alıcıdaki daha yeni dosyaların korunmasını istiyorsanız, -u (--update) bayrağını kullanmalısınız.

-u, --update Bu, rsync'i hedefte var olan dosyaları atlamaya ve kaynak dosyadan daha yeni bir değiştirilmiş zamana sahip olmaya zorlar. (Mevcut bir hedef dosya, kaynak dosyaya eşit bir zamana sahipse, boyutlar farklıysa güncellenecektir.)


2
Evet, gerçekten sorun buydu. -tBayrak eklemeyi unuttum , bu yüzden yeni dosya için uygun değişiklik zamanı gelmedi ve sonraki rsync çağrıları daha yeni dosyayı güncellemeye çalışıyordu. Teşekkürler!
Rogach

13
@Rogach Olmamak rsync -aiçin iyi bir nedeniniz olmadığı sürece her zaman kullanın .
Gilles 'SO- kötülük' dur

OP'de de aynı problemi alıyordum ama -abu durumda farklı bir soruna yol açacaktı, yani bir hata skipping directory .. Nedeni -aiçeriyordu -rve sanırım klasörün içinde hiçbir dizin yoksa bu hatayı veriyor. Bu blog yazısında
kakule

@cardamom One hala -avarsayılan olarak kullanmalı ve sonra istemediğiniz herhangi bir seçeneği --no-önekle açıkça devre dışı bırakmalıdır . Senin durumunda olur rsync -a --no-r.
Walf,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.