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

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

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

Ця стаття навчить нас, як працює Rysnc, і наведе кілька корисних прикладів.

Як працює rsync?

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

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

  • Використовуйте ssh, rsh для копіювання/синхронізації між двома хостами.
  • Використовуйте демон TCP rsync для копіювання/синхронізації.

Оскільки він розроблений для роботи в Unix-подібних системах, він також працює в Linux.

Покроковий процес rsync використовує так:

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

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

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

Перш ніж почати:

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

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

Навіщо використовувати rsync через Scp?

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

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

scp option SOURCE DESTINATION

Однак залишається питання, навіщо використовувати rsync замість scp?

Що ж, використання rsync має багато переваг. Ці переваги включають:

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

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

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

Команда rsync така:

Нижче наведено визначення термінів:

  • OPTION – це параметри rsync
  • SOURCE – вихідний каталог
  • DEST – каталог призначення
  • USER – віддалене ім’я користувача
  • ХОСТ – ім’я віддаленого хоста або IP-адреса

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

  Графічні процесори NVIDIA серії RTX 3000: ось що нового

Інші параметри rsync включають:

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

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

Більшість систем Unix і Linux постачаються з інстальованим rsync. Якщо у вашій системі немає 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
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

Примітка: ми залишили каталог dest порожнім.

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

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

  Заблокуйте зустріч, щоб уникнути небажаних користувачів

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

параметр rsync ДЖЕРЕЛО ПРИЗНАЧЕННЯ

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

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

Тепер скопіюйте та вставте наступний текст у наноредактор.

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-адресу віддаленої машини, щоб це працювало. Крім того, вам потрібно додати 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

Щоб скопіювати кілька файлів або каталогів з локального на віддалений, вам потрібно вказати шлях у фігурних дужках (розділених комами) після IP-адреси сервера.

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

Так само ви можете згадати файли.

Показати поточний прогрес під час передачі

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

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

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

Вам потрібно використовувати опцію –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

Результат схожий на той, який ми запускали раніше. Однак ви помітите згадку (СУХИЙ РАБОТ) у кінці результату.

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

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

Отже, якщо ви хочете передати з мінімальним розміром 15 Кб, вам потрібно використовувати –min-size=15 Кб.

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 КБ.

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

Якщо ви виконуєте інші завдання, які потребують великої пропускної здатності, ви можете налаштувати rysnc на встановлення обмеження пропускної здатності для передачі. Для цього використовуйте –bwlimit=KB/s.

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

Тут ми встановлюємо пропускну здатність 100 Кбіт/с під час передачі.

Заключні слова

Це веде нас до кінця нашого посібника з команд rsync. Ми навчилися використовувати rysnc і ефективно розглянули багато команд.

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

Далі перегляньте шпаргалки командного рядка для Windows, Linux і macOS.