4

Можно ли с помощью 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 (Просто новые файлы ... не несуществующие папки по назначению)

5 ответов5

2

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

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

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

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

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

0

Вы можете сгенерировать набор правил фильтрации на целевой машине следующим образом:

find /destdir/ -type d -printf 'show /%P/\nshow /%P/*\n'; echo 'hide *'

Вы можете добавить это в аргументы командной строки или записать результат в файл и включить его с помощью правила фильтра merge . Вы могли бы даже сделать что-то вроде этого:

rsync srcdir/ target:/destdir/ --filter='merge '<(ssh target \
    find /destdir/ -type d -printf 'show /%P/\nshow /%P/*\n'; echo 'hide *')

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

Любой каталог или файл, который существует на цели, но не на источнике, может быть удален, если вы также укажете --delete . Если это не то, что вам нужно, вы можете использовать include и exclude вместо show and hide .

Все это непроверено, поэтому я не буду обвинен в любой потере данных, которая вызывает вас.

0

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

0

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

найти [target_dir] -type d> [target_dir]/include.file

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

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

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

0

может быть, сделать нормальный 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

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