Материал просмотрен 3,585 раз(а)

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

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

Кстати, такой же ерундой копировал мелкие файлы (бэкап с телефона), и заливал файлы обратно на PSP. Кстати, в срочном ремонте psp помогла сторонняя контора, а данные вынимал я.

Есть ли какое-нибудь более интеллектуальное средство, чем команда простого копирования cp, которая тупо копирует файлы один за другим.

Решение этой проблемы найдено.

Программа rsync, помимо всего прочего, может копировать (синхронизировать) только изменившиеся файлы, отслеживая целые каталоги.

Разберемся с ее работой. Изначально она у меня не была установлена, но
для FreeBSD
# cd /usr/ports/net/rsync
# make install clean
# rehash

для Debian
# apt-get install rsync

все решили.

install rsync

install rsync

Создадим тестовые каталоги (/home/test для исходных файлов, /home/test-in для синхронизации)

# mkdir /home/test
# mkdir /home/test-in

Наполним каталог /home/test различными файлами.

Создаем файлы

Создаем файлы

Обратим внимание на дату и время файлов. 12:25 – у всех. Это нам пригодится. На скрине ниже я показываю сравнение двух каталогов.

Сравнение каталогов

Сравнение каталогов

Выполняю команду:

# rsync -av –stats /home/test/ /home/test-in

-av, -a – это архивация с сохранением прав доступа; -v – verbose, – расширенный вывод.

–stats – статистика, на скрине указана статистика о скопированных байтах и символах.

Далее – два каталога, откуда и куда. Обратите внимание на слеш в конце “откуда” /home/test/ – в этом случае будет копироваться только содержимое каталога test. Если слеш не ставить, то внутрь каталога назначения будет помещен сперва сам каталог test, а в него уже файлы. Т.е. исходная структура /home/test-in/test/…txt, чтобы эту вложенность избежать, я поставил слеш.

Синхронизация первая

Синхронизация первая

Как видно на скрине выше, скопировано 5 файлов и есть подробная статистика.

Теперь, мы модифицируем файл 3.txt, запишем в него текст командой echo. И проведем синхронизацию снова.

Копирование изменений

Копирование изменений

Как видите, скопировался только измененный, 3-ий файл. Это нам и нужно! Таким способом я и копирую на флешку только изменившиеся файлы, для бэкапа.

А как быть, если файлы удалены?

Файл не удаляется

Файл не удаляется

Мы видим, что файл, несмотря на отсутствие в источнике, все еще есть в получателе, поскольку команда rsync отработала только в одну сторону. Для решения этой проблемы и существует ключик –delete

Файл удаляется

Файл удаляется

На скрине выше видно, что команда rsync удалила файл 2.txt, который исчез в папке-источнике.

Важно! Нужно быть осторожным при работе с опцией –delete. Неправильное указание пути и все файлы в каталоге-получателе будут безвозвратно утеряны!