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

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

Я использую rsync для синхронизации большой общей папки с документами с моим ноутбуком. А именно, я выполняю rsync ИЗ моего ноутбука В общий репозиторий. Я хотел бы выполнить rsync только тех файлов, которые были созданы/изменены моим пользователем. Поскольку это общий репозиторий, другие люди могли создать другие каталоги или файлы.

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

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

Есть идеи?

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

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

решение1

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

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

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


Вы делаете двустороннюю синхронизацию. Rsync не очень хорош в этом: если вы забудете его запустить или случайно запустите его в неправильном направлении, вы, скорее всего, потеряете работу без предупреждения.Унисонхороший инструмент для двусторонней синхронизации: он всегда синхронизируется в обоих направлениях и жалуется, если файл изменился с обеих сторон. Он имеет открытый исходный код и хорошо интегрирован в платформы Unix и Windows.

К сожалению, у unison нет возможности игнорировать файлы по владельцу, как и у rsync. Вы можете создать список игнорирования с помощью find -user, но это становится беспорядочным, и возникает состояние гонки, если кто-то другой добавляет или удаляет файлы между запуском findи запуском unisonили rsync.

Вы можете пропатчить rsync или unison, чтобы добавить возможность игнорировать файлы на основе их метаданных. Я только что быстро просмотрел исходный код, и в обоих случаях код исключения тесно связан со строками, а не с записями каталогов. Это выглядит выполнимым, но это не тривиальный патч.


Вы можете создать представление файловой системы, содержащее только ваши файлы. У меня нет полного, бесшовного решения, но вот несколько идей для начала.

  • Если общая машина поддерживает жесткие ссылки (все Unix-системы поддерживают их, а 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 и unison. После первоначального создания файл в общем репозитории, владельцем которого вы являетесь и у которого счетчик ссылок равен 1, должен быть удален, а файл в вашем представлении со счетчиком ссылок равен 1 должен быть связан в общем репозитории. Все это довольно неуклюже, и я был бы рад предложениям по улучшению.

  • Если общая машина поддерживаетПРЕДОХРАНИТЕЛЬ, вы можете использовать его для создания живого представления общего репозитория, содержащего только ваши файлы. Я не знаю ни одной существующей файловой системы FUSE, которая может это сделать, ноbindfsприближается (я не смотрел код, чтобы оценить сложность кодирования).

  • Вы можете использовать LD_PRELOADto override readdir(или эквивалент в Windows) при запуске rsync или unison, чтобы возвращались только файлы, владельцем которых вы являетесь.

Связанный контент