Чому rsync намагається скопіювати вже оновлений файл?


24

У мене є два однакові файли, на локальній машині та на віддаленому. Їх розміри рівні, а файл на локальній машині новіший, ніж на віддаленому - але 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, кожен з яких має файл foobar. У ~ / src / foobar ви пишете "foo", а потім у ~ / dest / foobar ви пишете "bar". Тепер ви rsync ~ / src до ~ / dest. Що б ви очікували?

Обидва файли мають однаковий розмір, але той у ~ / dest є новішим. Стандартна поведінка Rsync полягає в заміні ~ / dest / foobar на ~ / src / foobar. Звичайно, файли можуть бути ідентичними, і це було б непотрібно, але немає ніякого способу знати, якщо ви не зробите контрольну суму або не порівнюєте біт на біт.

Якщо ви не хочете, щоб така поведінка, тобто ви хочете, щоб новіші файли в приймачі зберігалися, вам потрібно використовувати прапор -u (- update).

-u, --update Це змушує rsync пропускати будь-які файли, які існують у пункті призначення, і мають модифікований час, який є новим, ніж вихідний файл. (Якщо в існуючому файлі призначення є час модифікації, рівний до вихідного файлу, він буде оновлений, якщо розміри різні.)


2
Так, це справді була проблема. Я забув додати -tпрапор, тому він не встановлював належного часу модифікації нового файлу, а наступні виклики rsync намагалися оновити новіший файл. Спасибі!
Рогач

13
@Rogach Завжди використовуйте, rsync -aякщо у вас немає вагомих причин цього не робити.
Жил "ТАК - перестань бути злим"

Я отримував ту саму проблему з ОП, але -aв цьому випадку це призвело б до іншої проблеми, а саме до помилки skipping directory .. Причина була в тому, що -aміститься, -rі я думаю, якщо в папці не було каталогів, вона дає цю помилку. Обговорюється в цій публікації щоденника
Cardamom

@cardamom Ще слід використовувати -aза замовчуванням, а потім явно вимкнути будь-яку опцію, яку ви не хочете, з --no-префіксом. У вашому випадку це було б rsync -a --no-r.
Уолф
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.