rsync: різниця між -size-only та -ignore-time


114

Я намагаюся зрозуміти, в чому різниця між двома варіантами

rsync --size-only

і

rsync --ignore-times

Наскільки я розумію, rsync за замовчуванням порівняє як часові позначки, так і розміри файлів, щоб вирішити, чи слід синхронізувати файл чи ні. Наведені вище варіанти дозволяють користувачеві впливати на таку поведінку.

Обидва варіанти, мабуть, принаймні усно призводять до одного і того ж: порівняння лише за розміром .

Чи пропускаю тут щось тонке?


18
Це, ймовірно , підходить краще на чому - то на кшталт SuperUser.com або Unix.SE , так як він про використання існуючого (НЕ-програмування , пов'язаний) інструмент , а не що - або безпосередньо пов'язано з написання коду.
Джеррі Труну

Відповіді:


110

Існує кілька способів порівняння файлів rsync - авторитетним джерелом є опис алгоритму rsync: https://www.andrew.cmu.edu/course/15-749/READINGS/required/cas/tridgell96.pdf . Стаття у Вікіпедії про rsync також дуже хороша.

Для локальних файлів rsync порівнює метадані, і якщо це виглядає, що не потрібно копіювати файл, оскільки розмір та часові позначки збігаються між джерелом та пунктом призначення, він не виглядає далі. Якщо вони не відповідають, файл cp - це файл. Однак що робити, якщо метадані відповідають, але файли насправді не однакові? Тоді rsync, ймовірно, не робив того, що ти задумав.

Файли одного розміру, можливо, все-таки змінилися. Один простий приклад - це текстовий файл, у якому ви виправляєте друкарські помилки, наприклад, змінюючи "teh" на "the". Розмір файлу однаковий, але виправлений файл матиме нову часову позначку. --size-onlyговорить "не дивіться на час; якщо відповідність розмірів припускає, що файли збігаються", це було б неправильним вибором у цьому випадку.

З іншого боку, припустимо, ви випадково зробили великий cp -r A Bвчора, але ви забули зберегти позначки часу, і тепер ви хочете робити операцію в зворотному порядку rsync B A. Усі ці файли, які ви cp'ed, мають вчорашню позначку часу, хоча вони вчора не були дійсно змінені, і rsync за замовчуванням закінчить копіювання всіх цих файлів та оновлення часової позначки до вчорашнього. --size-onlyможе бути вашим другом у цьому випадку (модуль на прикладі вище).

--ignore-timesкаже порівняти файли незалежно від того, чи мають файли однаковий час зміни. Розгляньте приклад друку вище, але тоді ви не тільки виправили помилку друку, але й використовували touchдля того, щоб виправлений файл мав такий самий час зміни, що і вихідний файл, скажімо, що ви проникли таким чином. Добре --ignore-timesбуде робити різні файли, навіть якщо розмір і час відповідають.


58

Коротка відповідь - це те, що --ignore-timesозначає більше, ніж випливає з назви. Він ігнорує і час, і розмір. На відміну від цього, --size-onlyробить саме те, що говорить.


Довга відповідь - це rsyncтри способи вирішити, чи файл застарів:

  1. Порівняйте розмір джерела та місце призначення.
  2. Порівняйте часову позначку джерела та місця призначення.
  3. Порівняйте статичну контрольну суму джерела та місця призначення.

Ці перевірки проводяться перед передачею даних. Зокрема, це означає, що статична контрольна сума відрізняється від контрольної суми потоку - пізніша обчислюється під час передачі даних.

За замовчуванням rsyncвикористовує лише 1 і 2. І 1, і 2 можна придбати разом одним stat, тоді як 3 вимагає прочитати весь файл (це не залежить від читання файлу для передачі). Якщо вказати лише один модифікатор, це означає:

  • При використанні --size-onlyвиконується лише 1 - часові позначки та контрольна сума ігноруються. Файл копіюється, якщо його розмір не є однаковим на обох кінцях.

  • За допомогою --ignore-timesжодного з 1, 2 або 3 не виконується. Файл завжди копіюється.

  • За допомогою --checksum3 додатково використовується 1, але 2 не виконується. Файл копіюється, якщо розмір і контрольна сума не збігаються. Контрольна сума обчислюється лише у тому випадку, якщо розмір відповідає.


1
--checksum - це саме те, що я шукав. Я копіював вихід збірки, який змінив час лише для більшості файлів. Додавання --checksum означало, що воно ігнорує різниці в часі, але переконується, що вони були біт однаковими. Це було те, що я очікував - неодноразово, щоб зробити це дякую вам за додаткову інформацію.
Джозеф Конноллі

50

Вам не вистачає, що rsync також може порівнювати файли за контрольною сумою.

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

--ignore-timesозначає, що rsync перевірятиме суму кожного файлу, навіть якщо часові позначки та розміри файлів збігаються. Це означає, що він синхронізує більше файлів, ніж поведінка за замовчуванням. Він буде включати зміни до файлів, навіть коли розмір файлу однаковий, а дата / час модифікації повернуто до початкового значення. Перевірка суми кожного файлу означає, що його потрібно повністю читати з диска, що може бути повільним. Деякі конвеєри побудови скидають часові позначки до конкретної дати (наприклад, 1970-01-01), щоб забезпечити, щоб кінцевий файл збірки був відтвореним для біт, наприклад, коли він упакований у файл tar, який зберігає часові позначки.


4
"скидання дати / часу навряд чи вдасться зробити на практиці, але це може статися" - Наприклад, при використанні програмного забезпечення, яке в ім'я відтворюваних складових примусово скидає кожен файл на 1970-01-01 замість дати та час фактичного створення / модифікації.

10
Насправді, я думаю, вам потрібен варіант -c, якщо ви хочете використовувати контрольні суми. Без нього --ignore-time копіюватиме всі файли беззастережно.
Едвард Фолк

1
Параметр -a може змінити ці параметри. У моєму випадку я використовував --compare-dir = і --size-only і отримував несподівані результати. Зміна -a на -r вирішила проблему.
dbagnara

@dbagnara Я сьогодні підтвердив, що - лише розмір "сидить на вершині" -a, або "перевизначає" -a. У мене був накопичувач, який з будь-якої причини встановлений з усіма змінами, збільшувався на місяць. Rsync для створення резервної копії копіював кожен файл (з -a ON). Додавання - лише для величини вирішило проблему і призвело до бажаних результатів (так -a - лише для розміру). Отже, я роблю висновок, що архів переосмислює лише розмір.
Томмі

1

У науковій системі Linux 6.7 на сторінці man на rsync написано:

--ignore-times          don't skip files that match size and time

У мене є два файли з однаковим вмістом, але з різними датами створення:

[root@windstorm ~]# ls -ls /tmp/master/usercron /tmp/new/usercron
4 -rwxrwx--- 1 root root 1595 Feb 15 03:45 /tmp/master/usercron
4 -rwxrwx--- 1 root root 1595 Feb 16 04:52 /tmp/new/usercron

[root@windstorm ~]# diff /tmp/master/usercron /tmp/new/usercron
[root@windstorm ~]# md5sum /tmp/master/usercron /tmp/new/usercron
368165347b09204ce25e2fa0f61f3bbd  /tmp/master/usercron
368165347b09204ce25e2fa0f61f3bbd  /tmp/new/usercron

З --size-only, два файли вважаються однаковими:

[root@windstorm ~]# rsync -v --size-only -n  /tmp/new/usercron /tmp/master/usercron

sent 29 bytes  received 12 bytes  82.00 bytes/sec
total size is 1595  speedup is 38.90 (DRY RUN)

З --ignore-times, два файли вважаються різними:

[root@windstorm ~]# rsync -v --ignore-times -n  /tmp/new/usercron /tmp/master/usercron
usercron

sent 32 bytes  received 15 bytes  94.00 bytes/sec
total size is 1595  speedup is 33.94 (DRY RUN)

Тому, схоже, це взагалі не --ignore-timesмає жодного ефекту.


2
--ignore-timesскопіював би файли, навіть якщо їх часові позначки були однаковими.
MisterMiyagi
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.