Я использую rsync для хранения большой общей папки документов в синхронизации с моим ноутбуком. Строго говоря, я - rsyncing ОТ своего ноутбука ДО общего repo. То, что я хотел бы сделать, является rsyncing только те файлы, которые были созданы/изменены моим пользователем. Будучи общим репозиторием другие люди, возможно, создали другие каталоги или файлы.
Я просмотрел различные rsync опции, но я не нашел то, что я ищу. Я могу --exclude
или --delete-excluded
но только давая шаблоны для соответствия имени файла, не каким-либо другим метаданным (или может я?).
Альтернатива, но несколько громоздкое решение могла быть запуском удаленный сценарий как find -not -perm $USER > excluded_files
и rsync, исключая тех, но я не сделал бы этого.
Какие-либо идеи?
обновление: для разъяснения данные по моему ноутбуку будут только частью данных по серверу. Вот пример
dir_1
и dir_2
dir_3
dir_1
и dir_2
, нет dir_3
Я предполагаю, что хранение копии всех файлов на Вашем ноутбуке не является опцией. Иначе это было бы намного легче.
Правильный инструмент здесь является инструментом управления версиями. Но я понимаю, что, если у всех пользователей нет минимального количества технической изощренности, заставляя их использовать инструменты управления версиями, не реалистическое предложение. И даже затем необходимо было бы тщательно выбрать то, что Вы проверяете на свой ноутбук.
Вы могли бы все еще использовать управление версиями. На общей машине зарегистрируйтесь во всех своих файлах и оставьте файлы других людей в покое. Сохраните отдельный контроль на своем ноутбуке. Фиксация и выезд каждый раз, когда Вы переключаете машины. Чем больше я думаю об этом, тем больше мне нравится эта опция: это не требует никакого кодирования или даже любых хрупких сценариев.
Вы делаете двухстороннюю синхронизацию. Rsync не хорош в этом: если Вы забудете выполнять его или случайно выполнять его в неправильном направлении, то Вы, вероятно, потеряете работу без предупреждения. Унисон является хорошим инструментом для двухсторонней синхронизации: это всегда синхронизируется двунаправлено, и это жалуется, изменился ли файл с обеих сторон. Это - открытый исходный код, и хорошо интегрированный и в Unix и в платформы Windows.
К сожалению, унисон не имеет опции проигнорировать файлы владельцем, больше, чем rsync. Можно генерировать черный список с find -user
, но это становится грязным, и существует состояние состязания, если кто-то еще добавляет, или удалите файлы между выполнением find
и выполнение unison
или rsync
.
Вы могли исправить rsync или унисон для добавления опции проигнорировать файлы на основе их метаданных. У меня просто был беглый взгляд на источник, и в обоих случаях код исключения сильно связывается со строками, не с записями каталога. Это выглядит выполнимым, но это не тривиальный патч.
Вы могли создать представление файловой системы, которая содержит только Ваши файлы. Я не имею полного, прозрачного решения, но здесь являюсь несколькими идеями начать.
Если общая машина поддерживает жесткие ссылки (все нельды делают, и Windows делает начиная с NT4, пока Вы используете NTFS), достаточно легко создать копию репозитория, содержащего только жесткие ссылки Ваших файлов:
cd /shared/repository
find . -user "$USER" -exec sh -c 'mkdir -p "/my/view/${0%/*}" &&
ln "$0" "/my/view/$0"' {} \;
или с zsh:
autoload zmv
zmv -L -Q '/shared/repository/(**/)(*)(u$UID)' "/my/view/$1$2"
Необходимо было бы бояться разрывать жесткие связи при редактировании или синхронизации. Я не знаю, как rsync и унисон справились бы. После начального создания должен быть удален файл в общем репозитории, который принадлежит Вам и имеет число каналов 1, и файл в Вашем представлении с числом каналов 1 должен быть связан в общем репозитории. Это все довольно неуклюже, и я приветствовал бы предложения для улучшения.
Если общая машина поддерживает FUSE, Вы могли бы использовать его для создания предпросмотра в реальном времени общего репозитория, содержащего только файлы. Я не знаю ни о какой существующей файловой системе FUSE, которая может сделать это, но bindfs приближается (я не посмотрел на код для оценки трудности с кодированием).
Вы могли использовать LD_PRELOAD
переопределять readdir
(или эквивалентный Windows) при выполнении rsync или унисон, так, чтобы это только возвратило бы файлы, принадлежавшие Вам.