Rsync я пользуюсь уже давно — для синхронизации данных между Windows системами. Для этого есть порт cwRsync, который очень просто устанавливается и настраивается. Итак, у нас имеется:
1. Удаленная система, на которой расшарена нужная директория
2. Локальная система, куда мы хотим записать изменения с удаленной системы
Синхронизация односторонняя, подразумевается, что мы возим с собой ноутбук, на который нужно время от времени скопировать файлы с десктопа и наоборот. Двусторонняя синхронизация с разрешением конфликтов — более сложный вопрос и лучше до этого не доводить 🙂
В Windows rsync видит все диски как "/cygdrive/<disk>", например "/cygdrive/c". Простой скрипт, выполняемый на ноутбуке и синхронизирующий директорию "work" с десктопом:
net use t: \\my-desktop\c
rsync -rltObv —delete —backup-dir=/cygdrive/c/backup /cygdrive/t/work /cygdrive/c
net use t: /delete
Для понимания процесса рассмотрим каждую опцию:
-r — рекурсивность, синхронизируются все директории внутри "work"
-l — можно опустить, если внутри директории нет ссылок (symbolic links), опция копирует ссылки в виде ссылок, а не файлов
-t — очень важная опция. При ее включении rsync смотрит время последней модификации файла и перезаписывает файл только в том случае, если оно отличается от времени файла на удаленном компьютере. Если ее не включить, rsync будет всегда перезаписывать все файлы, на что уйдет значительно больше времени.
-O — не применять "-t" к директориям. Если не включить эту опцию, новые директории на локальной системе не будут создаваться.
-v — выдавать на экран сообщения, какие файлы записались или удалились
-b — делать бекап всех перезаписанных или удаленных файлов
—backup-dir — директория, в которой создаются бекапы
—delete — удалять те файлы, которых нет на удаленной системе
В Windows эта схема уже давно отработана и без проблем служит мне много лет. Однако в Mac OS есть некоторые нюансы.
Если под Windows мы всегда синхронизировали между собой 2 системы с NTFS, то здесь одна из систем это FAT32 или exFAT (рассматривается случай, когда на машине стоит еще Windows и раздел с документами общий для обеих ОС). При подключении к Mac OS FAT, файлы на котором были записаны другой ОС, все файлы по умолчанию имеют статус "locked", т.е. "read only". Их нельзя перезаписать даже с админскими правами. Однако этот флажок можно снять. Делается это так:
chflags -R nouchg *
Теперь мы можем быть уверены, что rsync без проблем перезапишет наши файлы, а ненужные удалит. rsync входит в состав той FreeBSD, на базе которой сделана Mac OS, но стоит там очень старая версия. Поэтому ставим новую версию из MacPorts:
sudo port install rsync
MacPorts помещает исполняемые файлы в /opts/local/bin, соответственно путь к правильной версии rsync будет /opts/local/bin/rsync.
Новая версия rsync значительно быстрее выполняет стадию сравнения двух директорий.
Однако я столкнулся с проблемой: около половины файлов почему-то перезаписывались, несмотря на идентичность. Причина оказалась очень простая: в FAT немного другой формат представления времени файла и время может отличаться на +-1 секунду, т.е. секунды в FAT это всегда четное число. Для устранения этого безобразия в rsync есть опция modify-window, которая устанавливает допустимый разброс времени. Достаточно добавить:
—modify-window=1
и проблема решена. Если синхронизация происходит на HFS — этой проблемы нет.
И еще одна небольшая проблемка — русские и другие нелатинские буквы отображаются HEX-значениями. На саму синхронизацию это не влияет, но выглядит некрасиво. Для этого у rsync есть опция "8" — показывать полные 8-битные символы.
Итак, вот пример скрипта под Mac OS, синхронизирующий папку на разделе FAT с папокй с Windows компьютера:
#!/bin/bash
mount -t smbfs //user:password@my-desktop/c /Volumes/my-desktop-c
cd /Volumes/FAT
chflags -R nouchg *
/opts/local/bin/rsync -rltObv8 —delete —backup-dir=/Volumes/FAT/backup —modify-window=1 /Volumes/my-desktop-c/work /Volumes/FAT
umount /Volumes/my-desktop-c
Конечно директория /Volumes/my-desktop-c должна быть заранее создана, чтобы в нее подмонтировался удаленный диск.
Я знаю способ значительно проще и быстрее в реализации — установка DropBox-а. 🙂
Ну ты блин прямо гуру командной строки! Про DropBox не слышал? 🙂
О! Тезка +1 :)))
DropBox тоже хорошо, но он для других задач предназначен. Таскать через ?нтернет 10+ Гб — это увольте 🙂 На самом деле у Apple есть iDisk — нативная служба типа дропбокса. Он сразу в Finder-е появляется и ничего ставить не нужно. У меня задача локально синхронизировать 2 машины. При этом не заморачиваясь с шифрованием. А полный бекап системы делается раз в месяц в Амазоновский клауд в шифрованном виде, но это опять же совсем другая задача.
? кстати при помощи rsync собственный "dropbox" организуется очень просто 🙂 Он ведь еще и в режиме сервера работает. Ставим на любую машину, пробрасываем порт и точно так же все синхронизируем. Только нет никаких ограничений и данные не хранятся на чужом сервере.