5

Я пытаюсь найти способ использовать rsync (один или несколько раз) и, возможно, другие команды (например, cp -lr) для выполнения следующих действий:

  1. Синхронизировать удаленную папку A с локальной папкой B
  2. У меня уже есть локальная папка C, которая является предыдущей синхронизацией A
  3. Я хочу, чтобы файлы без изменений между C и A создавались в B как жесткая ссылка
  4. Я хочу, чтобы новые файлы в A передавались обратно в B
  5. Я хочу, чтобы файлы, которые были удалены в A, не были жестко связаны в B или жестко связаны, а затем удалены.
  6. Я хочу, чтобы файлы, которые были изменены (путем добавления данных) в A, скопированы локально из C в B, и чтобы только новые байты передавались и добавлялись в новую копию.

Несколько ограничений, которые я знаю, чтобы быть правдой, могут помочь найти решение:

  • В A есть 2 вида файлов:
    1. Неизменные, которые либо создаются новые, либо удаляются.
    2. Изменчивые, которые всегда изменяются путем добавления данных, а также могут быть удалены.
  • Эти два вида файлов можно легко различить, так как каждая группа имеет фиксированный префикс, поэтому любые команды могут быть нацелены либо на группу, либо на обе.

Мое текущее решение заключается в использовании

rsync -av --link-dest C remote:A B

Но это имеет тот недостаток, что добавленные файлы передаются полностью, увеличивая громкость более чем в 10 раз.

Любые улучшения по сравнению с этим решением приветствуются, и даже лучше, если все передачи выполняются с помощью rsync.

ПРИМЕЧАНИЕ: можно использовать несколько раундов rsync для достижения этого, отсутствие атомарности в этом смысле не является проблемой, пока C не изменяется.

1 ответ1

1

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

Хитрость заключается в том, что вы используете следующие аргументы:

rsync --suffix "" --backup-dir "." ...

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

Тогда последовательность выполнения желаемого поведения может быть следующей:

# locally hard-link the mutable files
rsync -ahv --link-dest C --include-from MUTABLE_FILES.filter C/* B

# copy locally + append remotely changed files 
# (also delete mutable files that disappeared at remote location A)
rsync -ahbv --suffix "" --backup-dir "." --append-verify \
      --include-from MUTABLE_FILES.filter --delete A/* B 

# now hard-link locally + transfer immutable files
rsync -ahv --link-dest C --include-from IMMUTABLE_FILES.filter A/* B

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

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