2016-01-03 20 views
4

Я хотел бы автоматически запускать одностороннюю синхронизацию между двумя локальными каталогами, используя rsync. Значение при обнаружении изменения в файле /dir1 или его подкаталогах, следующая команда должна работать:Как использовать fswatch и rsync для автоматической синхронизации каталогов?

rsync -rtuv /dir1 /dir2

Как я могу идти о достижении этой цели с fswatch?

Можно ли предоставить аргументы для rsync только для копирования фактических файлов, которые были изменены в соответствии с событиями fswatch?

+0

Спросит на https://apple.stackexchange.com или https://unix.stackexchange.com – trojanfoe

+0

'rsync' уже довольно оптимален только для выполнения минимально необходимых обновлений - почему бы просто не пойти с' fswatch. | при чтении f; делать echo rsync; сделано?? http://bryanpendleton.blogspot.co.uk/2010/05/rsync-algorithm.html –

ответ

10
alias run_rsync='rsync -azP --exclude ".*/" --exclude ".*" --exclude "tmp/" ~/Documents/repos/my_repository [email protected]:~' 
run_rsync; fswatch -o . | while read f; do run_rsync; done 

Вторая линия проходит run_rsync раз безоговорочно, а затем - при каждом изменении в текущем каталоге (или указать точный путь вместо .)

Rsync вариантов:

  • -a - означает " архив "и синхронизирует рекурсивно и сохраняет символические ссылки, специальные и файлы устройств, время модификации, группу, владельца и разрешения.
  • -z - компрессия
  • -P - объединяет флаги --progress и --partial. Первый из них дает прогресс бар для передачи и вторые позволяют возобновить прерванные переводы
  • --exclude - исключают файлы по шаблону

Вам потребуются fswatch:

brew install fswatch 
+2

Очень приятный пост ниндзя. Возможно, использование '-or' после' fswatch' было бы лучше, для рекурсивности. –