1

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

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

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

Есть идеи?

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

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

1 ответ1

1

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

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

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


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

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

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


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

  • Если общий компьютер поддерживает жесткие ссылки (все блоки поддерживают, и Windows поддерживает начиная с NT4, если вы используете NTFS), достаточно легко создать копию хранилища, содержащую только жесткие ссылки ваших файлов:

    cd /shared/repository
    find . -user "$USER" -exec sh -c 'mkdir -p "/my/view/${0%/*}" &&
                                  ln "$0" "/my/view/$0"' {} \;
    

    или с зш:

    autoload zmv
    zmv -L -Q '/shared/repository/(**/)(*)(u$UID)' "/my/view/$1$2"
    

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

  • Если общий компьютер поддерживает FUSE, вы можете использовать его для создания живого представления общего репозитория, содержащего только ваши файлы. Я не знаю ни одной существующей файловой системы FUSE, которая могла бы это сделать, но bindfs подходит близко (я не смотрел код, чтобы оценить сложность кодирования).

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .