Як саме rsync вирішує, що синхронізувати?


15

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

Сценарій: Я rsync -av --progress /dir/a /dir/b і це робить свою справу.

Я додаю нові файли в / dir / a і знову запускаю ту саму команду, вона знає, що це зробила, і лише копіює нові файли.

Я додаю нові файли в / dir / a і перейменую деякі файли в / dir / b, а можливо, також видаляю декілька.

Якщо я rsync -av --progress /dir/a /dir/bзнову забіжу, що буде скопійовано? Просто нові файли, оскільки він знає, що раніше копіював, або файли, які також були перейменовані / видалені, тому що їх більше немає.

І в якості бонусу, якщо раніше скопійовані файли будуть скопійовані знову, є спосіб , щоб запобігти цьому, так що тільки нові доповнення до / ріжу / а копіюються?

На даний момент я радий перевіряти речі вручну, але в міру збільшення даних мені потрібно більше автоматизації для виконання цього завдання.


3
-iПрапор дуже зручно. Для кожного файлу він дає рядок відповідності, який можна розшифрувати, щоб побачити, чому він збігався (прапор для модного часу, розмір прапора тощо)
BowlOfRed

Відповіді:


17

Я додаю нові файли в / dir / a і знову запускаю ту саму команду, вона знає, що це зробила, і лише копіює нові файли.

Ні, він не знає, що робив у попередньому циклі. Він порівнює дані на приймальній стороні з даними, які потрібно надіслати. Маючи досить малі дані, це не буде очевидно, але якщо у вас є достатньо великі каталоги, легко відчути час, витрачений на порівняння перед початком копіювання.

Перевірка за замовчуванням - це час і розміри модифікації файлів. Від man rsync:

-c, --checksum
      This changes the way rsync checks if the files have been changed
      and  are in need of a transfer.  Without this option, rsync uses
      a "quick check" that (by default) checks if each file’s size and
      time of last modification match between the sender and receiver.
      This option changes this to compare a 128-bit checksum for  each
      file  that  has a matching size.  Generating the checksums means
      that both sides will expend a lot of disk I/O  reading  all  the
      data  in  the  files  in  the transfer (and this is prior to any
      reading that will be done to transfer changed  files),  so  this
      can slow things down significantly.

І:

-u, --update
      This  forces  rsync  to  skip  any  files  which  exist  on  the
      destination  and  have  a  modified  time that is newer than the
      source  file.   (If  an  existing   destination   file   has   a
      modification time equal to the source file’s, it will be updated
      if the sizes are different.)

Зауважте, що вони не мають на увазі використовувані вами варіанти. -aє:

-a, --archive               archive mode; same as -rlptgoD (no -H)
-r, --recursive             recurse into directories
-l, --links                 copy symlinks as symlinks
-p, --perms                 preserve permissions
-o, --owner                 preserve owner (super-user only)
-g, --group                 preserve group
    --devices               preserve device files (super-user only)
    --specials              preserve special files
-D                          same as --devices --specials
-t, --times                 preserve times

Найкращий опис, який я бачив (поки що), дякую
SPooKYiNeSS

2
Невелике доповнення. Перейменовані файли розглядаються як унікальні файли на будь-якому кінці. Якщо вказати --fuzzyодин раз, ви визнаєте їх однаковими в одному каталозі. Використання --fuzzyвдвічі розширює цю можливість на інші місця. Детальніше man rsyncдив. Звичайно, однією з основних причин використання rsyncє його здатність копіювати лише ті частини файлу, які змінилися. Це може зробити передачі по мережі набагато швидшими. До речі, параметр контрольної суми згаданий вище для пояснення того, як rsyncпрацює. У більшості випадків його не слід застосовувати.
Джо

6

Загальні

Якщо я правильно зрозумів, rsync -avнемає пам'яті, тому він буде копіювати файли, які були перейменовані / видалені теж, тому що вони є у джерелі, але більше не присутні в цілі.

Поради

  • Скористайтеся опцією -n"сухий запуск", щоб перевірити, що відбувається перед запуском rsyncкомандного рядка.

  • Зауважте особливе значення продільної косої риски після вихідного каталогу та побачите різницю між ними

    rsync -av --progress dir/a/ dir/b
    

    і

    rsync -av --progress dir/a dir/b
    

    що описано в посібнику man rsync.

Приклад

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

Але ви можете видалити його з вихідного каталогу або ввести ім'я файлу у файл excludedі скористатися опцією --exclude-from=excluded(для багатьох файлів) або просто --exclude=PATTERNдля одного або кількох файлів.

$ rsync -avn --progress dir/a/ dir/b
sending incremental file list
./
file-1
file-2

sent 103 bytes  received 25 bytes  256.00 bytes/sec
total size is 13  speedup is 0.10 (DRY RUN)

$ rsync -av --progress dir/a/ dir/b
sending incremental file list
./
file-1
              6 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=1/3)
file-2
              7 100%    6.84kB/s    0:00:00 (xfr#2, to-chk=0/3)

sent 196 bytes  received 57 bytes  506.00 bytes/sec
total size is 13  speedup is 0.05

$ echo textx-3>./dir/a/file-3

$ rsync -avn --progress dir/a/ dir/b
sending incremental file list
./
file-3

sent 121 bytes  received 22 bytes  286.00 bytes/sec
total size is 21  speedup is 0.15 (DRY RUN)

$ rm dir/b/file-1 
rm: ta bort normal fil 'dir/b/file-1'? y

$ rsync -avn --progress dir/a/ dir/b
sending incremental file list
./
file-1
file-3

sent 124 bytes  received 25 bytes  298.00 bytes/sec
total size is 21  speedup is 0.14 (DRY RUN)

$ rsync -avun --progress dir/a/ dir/b
sending incremental file list
./
file-1
file-3

sent 124 bytes  received 25 bytes  298.00 bytes/sec
total size is 21  speedup is 0.14 (DRY RUN)

$ rsync -avun --exclude=file-1 --progress dir/a/ dir/b
sending incremental file list
./
file-3

sent 104 bytes  received 22 bytes  252.00 bytes/sec
total size is 15  speedup is 0.12 (DRY RUN)

Альтернатива: unison

Ви можете перевірити інструмент unison, який є інструментом синхронізації . Він надає наочний метод виявлення особливих випадків і вирішення, що робити. Існує версія GUI ( unison-gtk).


Гарні приклади дякую. Я знав / в кінці речі, я просто просив це у додатку, і пропустив його (і ви добре бачите, що я просто скопіював / опублікував
SPooKYiNeSS

І знову це надсилається, перш ніж я закінчу, і не дасть мені змінити коментар ... Скопіював / вставив другий. Я погляну на unuon і побачу, чи може він робити те, що я хочу, а якщо ні, я повернусь до плану b і просто сформулюю сценарій
SPooKYiNeSS

Я використовую unison-gtkвже кілька років, і я задоволений цим. (Я також використовую rsync.)
sudodus

1

Він лише копіює нові файли в / dir / a. Все, що ви робите в / dir / b, буде ігноровано, якщо не скористаєтесь опцією --delete. У такому випадку перейменовані файли в / dir / b будуть видалені. Це змусить / dir / b стати точно подібним / dir / a.

Щодо бонусу, ви маєте на увазі, як у випадку перейменування файлів у / dir / a, а потім rsyncing до / dir / b? Я не думаю, що існує спосіб запобігти rsync просто копіювати файли в такому випадку.


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