Обновление от 12.11.2010: В Dropbox 0.8.x реализована выборочная синхронизация.
Вчера @Oxystin задал мне интересный вопрос:
У меня есть приложение, данные которого синхронизируется через Dropbox. Эти данные представляют собой папку с множеством файлов. Все работает. Но есть одно важное требование. Необходимо, чтобы один файл из этой папки не синхронизировался с Dropbox. Можно ли это каким-то образом реализовать?
Я начал искать решение, и в итоге сообщил две новости. Как обычно, одну хорошую, и одну плохую. Хорошая заключалась в том, что @Oxystin не один, другие тоже хотят получить такую функциональность:
Question from David W. Mac OS X… I have synced my Firefox profile folder with a symlink. All works well, except that the “sessionstore.js” file gets updated a million times per hour (slight exaggeration for effect…) Is there any way to exclude this file from being synced, while the other files in teh Profile folder -are- synced?
Answer from Chris J. Not at this time, although the .08xx series will have selective sync.
Плохая же новость в том, что выборочная синхронизация будет только в ветке 0.8.xx, а сейчас текущая версия - 0.7.81.
Т.е. прямо реализовать требуемое нельзя.
Однако можно скрестить ежа с ужом - Dropbox с rsync. rsync (работающий по cron) будет синхронизировать данные в каталог Dropbox, исключая некоторые файлы, а уже доставка обновлений по сети возьмёт на себя Dropbox.
Минусов хватает. Dropbox синхронизирует “на лету”, и могут возникнуть проблемы с актуальностью и целостностью файлов, если Dropbox не успеет докопировать файл, а он уже пойдёт в rsync. Для такой схемы нужно в два раза больше места. Нужно делать много телодвижений на всех компьютерах, участвующих в синхронизации. Могут быть нюансы с двунаправленной синхронизацией. Ключи rsync, приведённые мною, могут быть не применимы для данной ситуации. И я не тестировал решение, я его всего раз пять запустил в рамках одной машины.
Поэтому использовать приводимое решение я категорически не рекомендую без тщательного переобдумывания. Я не несу никакой ответственности за потерю данных - это не решение, это описание метода.
Но в качестве задачки для ума привожу скрипт двунаправленной синхронизации:
#!/bin/sh srcParent="/Users/ctrld" srcName="test" dropboxDir="/Users/ctrld/Dropbox/Private" excludeFile="/Users/ctrld/rsync.exclude" touch $excludeFile mkdir -p $srcParent/$srcName mkdir -p $dropboxDir/$srcName rsync -vrlptgoEvu --exclude-from=rsync.exclude $srcParent/$srcName $dropboxDir rsync -vrlptgoEvu --exclude-from=rsync.exclude $dropboxDir/$srcName $srcParent
Содержимое rsync.exclude (я исключаю единственный файл в корне каталога test)
$ cat rsync.exclude Jupiter.gif
Для сведения описание ключей:
-v, --verbose increase verbosity -r, --recursive recurse into directories -l, --links copy symlinks as symlinks -p, --perms preserve permissions -t, --times preserve times -g, --group preserve group -o, --owner preserve owner (super-user only) -E, --extended-attributes copy extended attributes, resource forks -u, --update skip files that are newer on the receiver --progress show progress during transfer --exclude-from=FILE read exclude patterns from FILE
А лучше всего ничего не скрещивать. Если вы можете настроить синхронизацию по rsync, то без проблем обойдётесь без Dropbox, который здесь выступает транспортом. Кроме этого есть и другие варианты синхронизации, например используя системы контроля версий SVN, GIT, etc. И есть другие сервисы синхронизации данных, которые можно выбирать под конкретную задачу. Меня же Dropbox вполне устраивает, а когда перестанет устраивать, то я найду ему альтернативу, подходящую под мои задачи.