Возможно ли с помощью 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, но этот должен дать вам хорошее направление для дальнейших действий.