Використання команди rsync для синхронізації файлів і каталогів [11 Examples]

Інструмент rsync: детальний огляд та приклади використання

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

У цій статті ми детально розглянемо, як саме функціонує rsync, а також наведемо декілька практичних прикладів його використання, щоб ви могли максимально ефективно використовувати цей інструмент у своїх робочих процесах.

Принцип роботи rsync

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

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

  • Використання протоколів SSH або rsh для передачі між двома хостами.
  • Застосування демона TCP rsync для копіювання та синхронізації.

rsync розроблений для роботи в Unix-подібних системах, тому він чудово підходить для Linux.

Покроковий процес роботи rsync виглядає наступним чином:

  • rsync використовує SSH для встановлення з’єднання з віддаленим хостом, запитуючи пароль при необхідності.
  • Після успішного підключення, rsync взаємодіє з джерелом даних.
  • Далі, інструмент визначає, які файли та каталоги потребують синхронізації, використовуючи алгоритм дельта-передачі для виявлення відмінностей.

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

Команда rsync здійснює інкрементне оновлення, зберігаючи різниці у тимчасовому файлі перед тим, як відправити їх до місця призначення.

Перед початком роботи з rsync, переконайтеся, що:

  • У вас є права root або sudo.
  • Ви маєте доступ до терміналу або командного рядка.
  • У вас є доступ SSH для безпечного виконання команд rsync.
  • Вам потрібні дві машини для створення rsync.

Для цього підручника ми будемо використовувати Linux Mint 21.1 Vera. Ви можете використовувати будь-який інший дистрибутив Linux, не змінюючи суттєво інструкції.

rsync vs. Scp: в чому різниця?

Scp (secure copy) є відомим протоколом командного рядка, який використовується для копіювання файлів. Він працює за лінійним принципом, тобто просто копіює файли з джерела до місця призначення, використовуючи SSH для забезпечення безпеки.

Синтаксис команди scp наступний:

scp option SOURCE DESTINATION

Однак, чому варто використовувати rsync, а не scp?

Використання rsync має ряд значних переваг:

  • Швидкість виконання: rsync є швидшим за scp, оскільки застосовує протокол віддаленого оновлення. Це дозволяє передавати лише відмінності, а не весь файл. Якщо ви налаштовуєте регулярну синхронізацію, повну копію потрібно робити лише перший раз, а наступні рази rsync копіює лише оновлені частини.
  • Економія пропускної здатності: Завдяки тому, що rsync не потрібно копіювати весь файл, це значно зменшує споживання пропускної здатності. Крім того, він також використовує алгоритми стиснення/декомпресії для зменшення розміру файлів під час передачі.
  • Більше параметрів командного рядка: rsync пропонує більше параметрів командного рядка, що дозволяє точніше налаштувати процес синхронізації.

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

Синтаксис команди rsync

Основний синтаксис команди rsync виглядає так:

rsync [OPTION] SOURCE [USER@]HOST:DEST

Пояснення термінів:

  • OPTION — це параметри команди rsync.
  • SOURCE — вихідний каталог.
  • DEST — каталог призначення.
  • USER — ім’я віддаленого користувача (необов’язково).
  • HOST — ім’я віддаленого хоста або IP-адреса.

Параметри надають додаткову функціональність. Наприклад, параметр `-r` дозволяє рекурсивно синхронізувати дані. Однак, він не синхронізує права власності, мітки часу, дозволи або символічні посилання. Для цього варто використовувати параметр `-a`, який запускає команду в режимі архіву, гарантуючи збереження всіх прав власності, дозволів та символічних посилань.

Інші корисні параметри rsync:

  • `-z`: стискання даних для економії місця.
  • `-h`: виведення у форматі, зручному для читання.
  • `-b`: резервне копіювання під час синхронізації.
  • `-e`: використання протоколу SSH для віддаленої передачі.
  • `–progress`: відображення прогресу синхронізації.
  • `-v`: виведення детальної інформації про процес.
  • `–n`: пробний запуск для перевірки налаштувань.
  • `-q`: придушення виводу команди та параметрів.

Встановлення rsync

Більшість Unix- та Linux-систем постачаються з вже встановленим rsync. Якщо у вас його немає, скористайтеся наступними командами:

Для Debian/Ubuntu та Mint:

sudo apt-get install rsync

Для Arch Linux:

pacman -S rsync

Для Gentoo:

emerge sys-apps/rsync

Для CentOS/Fedora/REHL:

sudo yum install rsync

Для openSUSE:

sudo zypper install rsync

В Linux Mint rsync вже встановлений за замовчуванням. Ви можете перевірити це, ввівши команду `rsync` у терміналі. Ви отримаєте детальну інформацію про можливості, параметри та інші важливі дані.

nitt ~
$ rsync
rsync  version 3.2.3  protocol version 31
Copyright (C) 1996-2020 by Andrew Tridgell, Wayne Davison, and others.
Web site: https://rsync.samba.org/
Capabilities:
    64-bit files, 64-bit inums, 64-bit timestamps, 64-bit long ints,
    socketpairs, hardlinks, hardlink-specials, symlinks, IPv6, atimes,
    batchfiles, inplace, append, ACLs, xattrs, optional protect-args, iconv,
    symtimes, prealloc, stop-at, no crtimes
Optimizations:
    SIMD, no asm, openssl-crypto
Checksum list:
    xxh128 xxh3 xxh64 (xxhash) md5 md4 none
Compress list:
    zstd lz4 zlibx zlib none

rsync comes with ABSOLUTELY NO WARRANTY.  This is free software, and you
are welcome to redistribute it under certain conditions.  See the GNU
General Public Licence for details.

rsync is a file transfer program capable of efficient remote update
via a fast differencing algorithm.

Далі розглянемо використання rsync на практичних прикладах.

Для наочності створимо два каталоги:

  • вихідний каталог
  • цільовий каталог

Скористаємося наступними командами:

mkdir source-directory
mkdir dest-directory

Для того щоб rsync мав файли для роботи, створимо декілька тестових файлів за допомогою наступної команди:

touch source-directory/file{1..100}

Це створить 100 порожніх файлів у вихідному каталозі. Ви можете перевірити це, ввівши команду `ls source-directory`.

ls source-directory
Output:
nitt rsync-tutorial
$ ls
dest-directory  source-directory
nitt rsync-tutorial
$ touch source-directory/file{1..100}
nitt rsync-tutorial
$ ls source-directory
file1    file18  file27  file36  file45  file54  file63  file72  file81  file90
file10   file19  file28  file37  file46  file55  file64  file73  file82  file91
file100  file2   file29  file38  file47  file56  file65  file74  file83  file92
file11   file20  file3   file39  file48  file57  file66  file75  file84  file93
file12   file21  file30  file4   file49  file58  file67  file76  file85  file94
file13   file22  file31  file40  file5   file59  file68  file77  file86  file95
file14   file23  file32  file41  file50  file6   file69  file78  file87  file96
file15   file24  file33  file42  file51  file60  file7   file79  file88  file97
file16   file25  file34  file43  file52  file61  file70  file8   file89  file98
file17   file26  file35  file44  file53  file62  file71  file80  file9   file99

Зверніть увагу, що каталог призначення залишається порожнім.

Локальне рекурсивне копіювання каталогів

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

У цьому випадку використовуємо синтаксис rsync:

rsync parameter SOURCE DESTINATION

Скопіюємо файли з нашого вихідного каталогу до цільового, виконавши наступну команду:

rsync -r source-directory/ dest-directory

Ця команда рекурсивно скопіює файли з вихідного каталогу до цільового.

nitt rsync-tutorial
$ ls
dest-directory  source-directory
nitt rsync-tutorial
$ ls dest-directory
nitt rsync-tutorial
$ ls source-directory
file1    file18  file27  file36  file45  file54  file63  file72  file81  file90
file10   file19  file28  file37  file46  file55  file64  file73  file82  file91
file100  file2   file29  file38  file47  file56  file65  file74  file83  file92
file11   file20  file3   file39  file48  file57  file66  file75  file84  file93
file12   file21  file30  file4   file49  file58  file67  file76  file85  file94
file13   file22  file31  file40  file5   file59  file68  file77  file86  file95
file14   file23  file32  file41  file50  file6   file69  file78  file87  file96
file15   file24  file33  file42  file51  file60  file7   file79  file88  file97
file16   file25  file34  file43  file52  file61  file70  file8   file89  file98
file17   file26  file35  file44  file53  file62  file71  file80  file9   file99
nitt rsync-tutorial
$ rsync -r source-directory/ dest-directory
nitt rsync-tutorial
$ ls dest-directory
file1    file18  file27  file36  file45  file54  file63  file72  file81  file90
file10   file19  file28  file37  file46  file55  file64  file73  file82  file91
file100  file2   file29  file38  file47  file56  file65  file74  file83  file92
file11   file20  file3   file39  file48  file57  file66  file75  file84  file93
file12   file21  file30  file4   file49  file58  file67  file76  file85  file94
file13   file22  file31  file40  file5   file59  file68  file77  file86  file95
file14   file23  file32  file41  file50  file6   file69  file78  file87  file96
file15   file24  file33  file42  file51  file60  file7   file79  file88  file97
file16   file25  file34  file43  file52  file61  file70  file8   file89  file98
file17   file26  file35  file44  file53  file62  file71  file80  file9   file99

Це скопіює кожен файл із вихідного каталогу до цільового.

Локальне копіювання окремого файлу

Тепер, коли ми розглянули синхронізацію каталогів, навчимося копіювати окремий файл.

Для цього відредагуємо файл `file1` у вихідному каталозі, а потім синхронізуємо його з тим же файлом у цільовому каталозі.

Для редагування файлу введіть команду:

nano source-directory/file1

Скопіюйте та вставте наступний текст у nano-редактор:

We're updating file1 in the source-directory.
Once we update, we'll push the new update to the dest-directory.
rsync doesn't need to re-copy the file using the delta-transfer algorithm.
This algorithm checks the differences and then updates destination files
accordingly.
So, once you save file1 in the source-directory, open file1 in
the dest-directory. It'll be empty.
However, if we check it after running rsync, you'll see that file1 in dest-directory
is updated.

Додавання вмісту до файлу

Збережіть та закрийте файл.

Тепер скопіюємо файл за допомогою rsync:

sudo rsync -v --existing source-directory/file1 /dest-directory
#Output
nitt rsync-tutorial
$ sudo rsync -v --existing source-directory/file1 dest-directory
file1

sent 557 bytes  received 35 bytes  1,184.00 bytes/sec
total size is 474  speedup is 0.80

nitt rsync-tutorial
$ 

Зверніть увагу, ми використали опцію `–existing`. Це оновлює лише наявні файли. Якщо ви запустите команду без цього параметра, файл не оновить вміст, навіть якщо команда виконається успішно.

Якщо файл, який ви копіюєте, не існує у цільовій папці, скористайтеся такою командою:

rsync -v source-directory/newfile dest-directory
#Output
nitt rsync-tutorial
$ rsync -v source-directory/newfile dest-directory
newfile

sent 82 bytes  received 35 bytes  234.00 bytes/sec
total size is 0  speedup is 0.00

Копіювання декількох файлів

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

Для цього створимо два нових файли `newfile2` та `newfile3` у вихідному каталозі. Використовуйте команду:

touch source-directory/newfile{2..3}

Тепер використаємо команду для синхронізації цих файлів:

rsync -v source-directory/newfile2 source-directory/newfile3 dest-directory
#Output
nitt rsync-tutorial
$ rsync -v source-directory/newfile2 source-directory/newfile3 dest-directory
newfile2
newfile3

sent 135 bytes  received 54 bytes  378.00 bytes/sec
total size is 0  speedup is 0.00
nitt rsync-tutorial
$ 

Копіювання файлу або каталогу з локального на віддалений сервер

Синтаксис rsync для передачі з локального на віддалений сервер виглядає так:

rsync option SOURCE [email protected]:DEST

Вам знадобиться IP-адреса віддаленої машини. Її потрібно вказати після вихідного файлу.

rsync -av /Projects/rsync-tutorial/source-directory 192.168.192.200: /Projects/rsync-tutorial/dest-directory

Перед початком передачі вас попросять ввести пароль. Якщо на віддаленій машині є інший користувач, потрібно вказати його перед IP-адресою та символом `@`.

rsync -av /Projects/rsync-tutorial/source-directory [email protected]: /Projects/rsync-tutorial/dest-directory

Для копіювання кількох файлів або каталогів, потрібно вказати шляхи до кожного:

rsync -av /Projects/rsync-tutorial/source-directory/newfile1 /Projects/rsync-tutorial/source-directory/newfile2 192.168.192.200: /Projects/rsync-tutorial/dest-directory

Спеціальні протоколи віддаленої передачі

rsync дозволяє вказати конкретні протоколи передачі файлів за допомогою параметра `-e` та назви протоколу.

Наприклад, для використання SSH, додайте `-e ssh` до команди rsync.

rsync -e ssh /Projects/rsync-tutorial/source-directory 192.168.192.200: /Projects/rsync-tutorial/dest-directory

Копіювання файлу або каталогу з віддаленого на локальний сервер

Синтаксис rsync для передачі з віддаленого на локальний комп’ютер виглядає так:

sync option [email protected]:SRC DEST

Для отримання файлів або каталогу з віддаленого сервера, виконайте команду:

rsync -av 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory

Ця команда завантажує файли з цільового каталогу віддаленого комп’ютера до вихідного каталогу на локальному комп’ютері.

Для отримання певного файлу, вкажіть його повний шлях:

rsync -av 192.168.192.200: /Projects/rsync-tutorial/dest-directory/newfile4 /Projects/rsync-tutorial/source-directory

Для копіювання декількох файлів або каталогів, вкажіть їхні шляхи в фігурних дужках, розділених комами:

rsync -av 192.168.192.200: {/Projects/rsync-tutorial/dest-directory/, /home/music/2023-music} /Projects/rsync-tutorial/source-directory

Аналогічно можна вказати і окремі файли.

Відображення прогресу передачі

Під час резервного копіювання великих обсягів даних, корисно слідкувати за прогресом. Для цього використовуйте опцію `–progress`. Це дозволить вам бачити швидкість передачі, час, що залишився, та обсяг переданих даних.

rsync -av --progress 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory

Видалення вихідних файлів після передачі

Використання параметра `–remove-source-files` дозволяє видалити вихідні файли після завершення передачі, що є корисним для захисту файлів або звільнення місця.

rsync -av --remove-source-files 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory

Тестовий запуск rsync

rsync також дозволяє виконувати тестові запуски для оцінки результатів перед фактичною синхронізацією. Це дозволяє перевірити правильність налаштувань та уникнути помилок.

Для тестового запуску використовуйте параметр `–dry-run`.

sudo rsync -v --dry-run source-directory/file1 dest-directory
nitt rsync-tutorial
$ sudo rsync -v --dry-run source-directory/file1 dest-directory
file1

sent 43 bytes  received 19 bytes  124.00 bytes/sec
total size is 474  speedup is 7.65 (DRY RUN)
nitt rsync-tutorial

Результат буде схожий на звичайний запуск, але в кінці буде вказано `(DRY RUN)`.

Встановлення мінімального та максимального розміру файлів

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

Наприклад, для передачі файлів розміром не менше 15 Кб, використовуйте `–min-size=15k`.

rsync -av --min-size=15k 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory

Команда скопіює файли розміром не менше 15 Кб. Файли меншого розміру будуть проігноровані.

Аналогічно, використовуйте параметр `–max-size` для встановлення максимального розміру файлів.

rsync -av --max-size=450k 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory

Тут rsync ігноруватиме файли розміром понад 450 Кб.

Встановлення обмеження пропускної здатності

Якщо вам потрібно обмежити пропускну здатність передачі для виконання інших завдань, скористайтеся параметром `–bwlimit=KB/s`.

rsync -av --bwlimit=100 --progress 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory

В цьому прикладі встановлено обмеження пропускної здатності на рівні 100 КБ/с.

Підсумки

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

rsync пропонує набагато більше можливостей, ніж ми розглянули тут. Для більш глибокого вивчення, ви можете переглянути сторінку довідки rsync, де детально описаний кожен аспект інструменту.

Не забудьте ознайомитися з шпаргалками командного рядка для Windows, Linux та macOS для покращення вашої продуктивності.