rsync: предотвращение файлов удаления, которые не принадлежат определенному пользователю

Я использую rsync для хранения большой общей папки документов в синхронизации с моим ноутбуком. Строго говоря, я - rsyncing ОТ своего ноутбука ДО общего repo. То, что я хотел бы сделать, является rsyncing только те файлы, которые были созданы/изменены моим пользователем. Будучи общим репозиторием другие люди, возможно, создали другие каталоги или файлы.

Я просмотрел различные rsync опции, но я не нашел то, что я ищу. Я могу --exclude или --delete-excluded но только давая шаблоны для соответствия имени файла, не каким-либо другим метаданным (или может я?).

Альтернатива, но несколько громоздкое решение могла быть запуском удаленный сценарий как find -not -perm $USER > excluded_files и rsync, исключая тех, но я не сделал бы этого.

Какие-либо идеи?

обновление: для разъяснения данные по моему ноутбуку будут только частью данных по серверу. Вот пример

  • мой ноутбук содержит dir_1 и dir_2
  • Я rsync их к серверу; теперь сервер содержит двух директоров
  • другой пользователь входит в систему сервер и создает новый каталог dir_3
  • Я порчу со своими файлами, теперь будет rsync снова, но должен использовать - удаляют
  • Я хочу к - удаляют ТОЛЬКО файлы, которые я создал на первом месте, т.е. файлах включенные dir_1 и dir_2, нет dir_3
1
задан 15.09.2010, 15:17

1 ответ

Я предполагаю, что хранение копии всех файлов на Вашем ноутбуке не является опцией. Иначе это было бы намного легче.

Правильный инструмент здесь является инструментом управления версиями. Но я понимаю, что, если у всех пользователей нет минимального количества технической изощренности, заставляя их использовать инструменты управления версиями, не реалистическое предложение. И даже затем необходимо было бы тщательно выбрать то, что Вы проверяете на свой ноутбук.

Вы могли бы все еще использовать управление версиями. На общей машине зарегистрируйтесь во всех своих файлах и оставьте файлы других людей в покое. Сохраните отдельный контроль на своем ноутбуке. Фиксация и выезд каждый раз, когда Вы переключаете машины. Чем больше я думаю об этом, тем больше мне нравится эта опция: это не требует никакого кодирования или даже любых хрупких сценариев.


Вы делаете двухстороннюю синхронизацию. 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 или унисон, так, чтобы это только возвратило бы файлы, принадлежавшие Вам.

1
ответ дан 17.12.2019, 00:34

Теги

Похожие вопросы