Добрались руки до rsync. Довольно большими возможностями обладает утилита rsync. Я просмотрел интересную статью: Rsync Примеры синхронизации и решил попробовать написать свой скрипт sh для синхронизации данных в двух разных папках. Кто-то скажет что скрипт в одну строку не скрипт, но часто короткие и простые решения на sh заменяют массу скриптов на PHP и ему подобных языков программирования. Допустим у вас есть некий шаблон для приложений и вы хотите его размножить. Можно копировать файлы при помощи команды cp. О команде cp читайте на странице как скопировать папку cp BASH. Если у вас мало файлов, то можно воспользоваться командой cp, но что делать если файлов много и они весят сотни мегабайт. Тут поможет утилита rsync. Рсинг заменяет только изменённую часть файла. Он может рекурсивно проникать в папки и синхронизировать содержимое. При копировании файлов можно включить сжатие файлов. Это хорошо помогает при синхронизации с удалённым сервером.
Посмотрите на пример. Создайте 2 папки: dir1, dir2. В папке dir1 создайте несколько файлов touch file{1..5}.txt. После синхронизации папка dir2 получит содержимое папки dir1. Одним словом, появится вторая зеркальная копия дерева файлов.
./dir1:
|_test
|_config f1.txt file2.txt file3.txt file4.txt file5.txt
./dir2:
|_test
Покажу вам простейшую схему того, как работает как работает rsync: rsync опции источник приемник. В опциях указывают ключи. В источниках и приёмниках помещают папки или файлы.
Если вы никогда не работали с rsync, то поработайте в тесовом режиме. Ключ --remove-source-files позволит утилите rsync удалить все файлы сразу после выполнения синхронизации. Используйте этот ключ осторожно. Ключ --delete удаляет файлы которых нет в папке-источнике. Это очень удобно! Вы можете сделать зеркальные копии содержимого папок.
#тестовая работа, показано удаление файлов после работы rsync
rsync --dry-run --remove-source-files -zvr /.../rsync/dir1/* /.../rsync/dir2/
#удаление файлов во время синхронизации
rsync -zvr --delete /.../rsync/dir1/* /.../rsync/dir2/
Очень часто в различных языках программирования применяют файл config с настройками. Заменять конфиг новым файлом нельзя. На каждой папке свой уникальный конфиг. Ключ --exclude 'config' позволяет исключать файл из синхронизации.
#при синхронизации не учитывается файл config
rsync -zvr --delete --exclude 'config' /.../rsync/dir1/* /.../rsync/dir2/
Возможно кто-то попробует синхронизировать данные при помощи git. Скажу что такой вариант возможен, но есть одна проблема - размер папки .git увеличится в разы. Рсинг справится с этой задачей быстрее. Во время работы он меньше потребляет ресурсов. Вы можете ограничить скорость передачи данных при помощи ключа --bwlimit
#--bwlimit=100 ограничивает пропускную способность
#при копировании бэкапа в 100 Кбайт в сек.
rsync -zvr --delete --exclude 'config' --bwlimit=100 /.../rsync/dir1/* /.../rsync/dir2/