Обновление от 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 вполне устраивает, а когда перестанет устраивать, то я найду ему альтернативу, подходящую под мои задачи.