Как использовать rsync для копирования файлов в Linux: простая инструкция.

Если вам нужно скопировать файлы между двумя Linux-серверами, поможет утилита rsync. Она быстро и эффективно переносит файлы, экономя трафик и время.

Кроме того, широкий спектр дополнительных параметров делает удобным использование rsync в качестве альтернативы стандартной команде cp при копировании файлов в пределах одного сервера.

В предыдущей статье мы разобрались как установить программу rsync на примере CentOS и Ubuntu.  Сегодня разберем практические примеры использования rsync.

Копирование в пределах одного сервера

Простейший вид команды:

rsync ./источник ./приемник

Наше тестовое окружение имеет следующий вид:

[root@waky practice]# ls -R ./
./:
destination  source
./destination:
./source:
dir1  dir2  test.txt
./source/dir1:
test1.txt
./source/dir2:
test2.txt
[root@waky practice]#

Есть директория source с одним файлом и двумя поддиректориями. В каждой поддиректории по одному файлу. Директория destination пустая, в нее будем копировать.

Чтобы скопировать отдельный файл, выполним следующую команду:

[root@waky practice]# rsync ./source/test.txt ./destination/
[root@waky practice]# ls ./destination/
test.txt
[root@waky practice]#

Попробуем тоже самое с директорией:

[root@waky practice]# rsync ./source/dir1 ./destination/
skipping directory dir1
[root@waky practice]#

Директория не скопировалась, чтобы копировать директории используется рекурсивное копирование, параметр -r:

[root@waky practice]# rsync -r ./source/dir1 ./destination/
[root@waky practice]# ls ./destination/
dir1  test.txt
[root@waky practice]# ls ./destination/dir1/
test1.txt
[root@waky practice]#

Скопировалась и сама директория и ее содержимое.

Использование параметра -v добавляет вывод информации о переданных файлах:

[root@waky practice]# rsync -rv ./source/dir2 ./destination/
sending incremental file list
dir2/
dir2/test2.txt
sent 123 bytes  received 39 bytes  324,00 bytes/sec
total size is 0  speedup is 0,00
[root@waky practice]# ls ./destination/
dir1  dir2  test.txt
[root@waky practice]#

Копируем вторую директорию, и вывод содержит список директорий и файлов переданных в процессе копирования.

На данном этапе содержимое исходной source и конечной destination директорий совпадает.

Попробуем использовать параметр -u:

[root@waky practice]# rsync -rvu ./source/ ./destination/
sending incremental file list

sent 176 bytes  received 14 bytes  380,00 bytes/sec
total size is 0  speedup is 0,00
[root@waky practice]#

Как видим, итоговый лист пуст, ничто не было скопировано, так как содержимое идентично. Изменим содержание файла ./source/test.txt и повторим синхронизацию:

[root@waky practice]# echo "test" > source/test.txt
[root@waky practice]# rsync -rvu ./source/ ./destination/
sending incremental file list
test.txt
sent 228 bytes  received 37 bytes  530,00 bytes/sec
total size is 5  speedup is 0,02
[root@waky practice]#

Из всех директорий и файлов скопировался только тот, который был изменен. Параметр -u означает update, позволяет копировать только изменившиеся файлы.

При работе с большим количеством файлов эта опция помогает сэкономить время, избегая повторного копирования файлов с одинаковым содержанием.

Еще один активно используемый параметр -a, позволяет рекурсивно копировать с  сохранением свойств файла (владелец, права):

[root@waky practice]# rsync -av ./source/ ./destination/
sending incremental file list
./
test.txt
dir1/
dir1/test1.txt
dir2/
dir2/test2.txt
sent 335 bytes  received 92 bytes  854,00 bytes/sec
total size is 5  speedup is 0,01
[root@waky practice]#

Если вам предстоит перенос большого количества файлов, перед запуском команды прогоните ее же с параметром  –dry-run фиктивное копирование:

[root@waky practice]# rsync -av --dry-run ./source/ ./destination/
sending incremental file list
./
test.txt
dir1/
dir1/file1.log
dir1/test1.txt
dir2/
dir2/file2.log
dir2/test2.txt
sent 264 bytes  received 42 bytes  612,00 bytes/sec
total size is 5  speedup is 0,02 (DRY RUN)
[root@waky practice]# 

Копирование файлов между серверами

Копирование между серверами отличается от копирования в пределах одного сервера в основном только тем, что нужно задать перед директорией параметры подключения к удаленному серверу.

Для передачи данных используется протокол  SSH, а значит нужно по такому же принципу указать пользователя и хост, к которому будем подключаться:

rsync ./источник пользователь@адрес:./приемник

[root@waky practice]# rsync -v source/test.txt waky@192.168.0.107:/home/waky/remote_destination
waky@192.168.0.107's password:
test.txt
sent 87 bytes  received 41 bytes  23,27 bytes/sec
total size is 5  speedup is 0,04
[root@waky practice]#

Перед копированием у нас попросят пароль. Если между серверами настроен доступ по ключу, то пароль не потребуется.

Используемый ключ можно задать в явном виде, как и порт, если он отличается от дефолтного, для этого применяется параметр -e:

[root@waky practice]# rsync -v -e 'ssh -p 22 -i ~/.ssh/id_ed25519' source/test.txt waky@192.168.0.107:/home/waky/remote_destination
test.txt
sent 87 bytes  received 41 bytes  85,33 bytes/sec
total size is 81  speedup is 0,63
[root@waky practice]#

Передача данных в обратном направлении отличается лишь тем, для какой директории указывается сервер:

[root@waky practice]# rsync -rv waky@192.168.0.107:/home/waky/remote_destination ./source/
receiving incremental file list
remote_destination/
remote_destination/test.txt
sent 47 bytes  received 221 bytes  536,00 bytes/sec
total size is 81  speedup is 0,30
[root@waky practice]# ls source/
dir1  dir2  remote_destination  test.txt
[root@waky practice]#

Мы скопировали к себе директорию remote_destination с удаленного сервера.

Заключение

Мы рассмотрели основные примеры использования команды rsync и ее параметры. Освоив данную утилиту, вы сможете легко копировать, передавать, обновлять файлы, как в рамках одного сервера, так и между серверами.