Если вам нужно скопировать файлы между двумя 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 и ее параметры. Освоив данную утилиту, вы сможете легко копировать, передавать, обновлять файлы, как в рамках одного сервера, так и между серверами.