rsync синхронизирует только файлы без создания папок в месте назначения

rsync синхронизирует только файлы без создания папок в месте назначения

Возможно ли с помощью rsync не создавать каталоги в месте назначения?

Представьте, что у меня есть такой источник:

a/
a/x.txt
b/
b/y.txt

И у меня есть это место назначения:

a/
a/z.txt

Желаемый результат rsync source destination:

a/
a/x.txt
a/z.txt

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


Для информации, такие ситуации действительно легко получить, в моем случае это:

  • Сервер с 2 дисками, скажем A& B. И локальный диск C.
  • Я обычно использую rsyncдля синхронизации (и объединения) удаленных Aи Bлокальных файлов C.
  • Затем иногда мне просто нужно синхронизировать некоторые Cфайлы обратно в Aи B. (Просто новые файлы... а не несуществующие папки в месте назначения)

решение1

Попробуйте следующее:

rsync -av src:/dir/to/files/* /dest/dir

Если у вас есть несколько вложенных подкаталогов, вам сначала нужно сделать что-то вроде этого:

find /dir/to/files -type d -print

Пропустите этот список каталогов через цикл и каждый раз вызывайте rsync. Конечно, если вы делаете это на удаленной машине, вам нужно будет выполнить find через ssh и сохранить результаты в массиве, а затем выполнить цикл rsync.

решение2

Я реализовал это для rsync и отправил патч в апстрим: https://lists.samba.org/archive/rsync/2015-November/030455.html

решение3

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

Для повышения безопасности этой операции вы можете использовать другого пользователя, а не того, который находится в целевой системе:

rsync $src $specialuser@server:$destination

Удаление удаленно созданных этим пользователем папок:

ssh $normalUser@destination "find $destination -type d -user $specialuser -exec rm -r {} \;"

А затем верните разрешения в нормальное состояние:

ssh $normalUser@destination "chown -R $defaultUser:$defaultGroup $destination"

черт, это выглядит грязно... это требует серьезных улучшений :D

решение4

Я бы рекомендовал создать файл include_file на вашей целевой машине, используя скрипт для добавления /*к каждой строке результата:

найти [целевой_каталог] -тип d >[целевой_каталог]/include.file

Затем вы можете использовать rsync, --include_file=[target_dir]/include.fileчтобы указать, что следует включить только те файлы, которые соответствуют шаблону в этом файле, — это должен быть полный список папок на целевом объекте в указанной вами точке.

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

Если у меня появится время, я выложу здесь пригодный для использования скрипт на Python, но этот должен дать вам хорошее направление для дальнейших действий.

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