rsync (англ. Remote Synchronization) — программа для UNIX-подобных систем, которая выполняет синхронизацию файлов и каталогов в двух местах с минимизированием трафика, используя кодировку данных при необходимости. rsync может копировать или отображать содержимое каталога и копировать файлы, опционально используя сжатие и рекурсию. wiki
Общий вид команды
rsync {OPTIONS} {FROM} {TO}
Копирование содержимого директории /local/folder/ с локальной машины на удаленный сервер user@server, в директорию /remote/folder/
rsync -e "ssh -p 22" --progress --partial --force -avz /local/folder/ user@server:/remote/folder/
Важно обратить внимание на последний слэш: если он есть то копируется содержимое папки, иначе - вся директория, вместе с названием.
--progress
- отображение прогрессбара --partial
- сохранение частей файлов после копирования (см. детали алгоритма работы rsync), ускоряет последующие копирования--force
- удаление не пустых директорий-e ssh
- использование ssh для синхронизации, порт указывается так -e "ssh -p22"
, настройка подключений по ssh без ввода пароля описана тут-a
- алиас для группы ключей (-rlptgoD), сохраняет разные атрибуты файлов/директорий при копировании, включает рекурсию-v
- вывод в консоль подробных действий -z
- компрессия передаваемых файловДругие полезные опции
-h
- удобный вывод размерностей;--max-size='150k'
- синхронизировать только файлы, размер которых меньше 150Kb;--bwlimit=100k
- ограничить скорость до 100Kb.Копирование отдельного файла
rsync --progress --partial -avz /local/file.ext user@remote.server:/remote/folder/
Синхронизация двух локальных папок с удалением из {TO} всего чего нет в {FROM}
rsync -av --delete /local/from/ /local/to/
Тоже предназначение, как и у предыдущей команды, только физически ничего не меняется (симуляция процесса)
rsync -avn --delete /local/from/ /local/to/
Показать разницу между двумя каталогами
rsync -avi /local/folder1/ /local/folder2/
И то, из-за чего мне понадобился rsync: надо синхронизировать из периодически обновляемого хранилища группу файлов в другую директорию. В rsync есть опция --files-from=list.txt которая синхронизирует только файл из списка в list.txt, разделитель - новая строка.
rsync -avh --files-from=list.txt --progress /local/folder1/ /local/folder2/
Несколько других полезных опции rsync
--exclude='*.pyc'
- исключить файлы совпадающие с маской *.pyc, regexp не поддерживается--exclude-from='files.txt'
- исключить файлы, которые упомянуты в files.txt, разделить имен - новая строка-h
- human-readable формат для размера файлов-u
- если файл в {TO} новее чем в {FROM}, то не заменять--existing
- обновление только уже существующих файлов, новые не копируются--max-size='7MB'
- не передавать файлы, больше 7 МБайтДля rsync есть графический интерфейс - Grsync.
Под Ubuntu нужно установить пакет grsync
sudo apt-get install grsync
Синхронизация файлов от root
Если нужно синхронизировать файлы от root'a то понадобятся кое-какие манипуляции.
Способ 1. На удаленной машине разрешаем rsync от root без пароля
# sudo visudo proft ALL= NOPASSWD:/usr/bin/rsync
Тут proft это пользователь под которым подключаемся.
На локальной машине добавим ключ --rsync-path
sudo rsync -e "ssh -p 22" --progress --force -avh --rsync-path="sudo rsync" /home/mariadb proft@server:/home/
Способ 2. Подключимся с локальной машины на удаленную с сохранением, на некоторое время, прав на sudo
stty -echo; ssh -p 22 proft@server sudo -v; stty echo
На локальной машине добавим ключ --rsync-path
sudo rsync -e "ssh -p 22" --progress --force -avh --rsync-path="sudo rsync" /home/mariadb proft@server:/home/
Дополнительное чтиво