rsync: как я могу настроить его для создания целевого каталога на сервере?

151

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

Как я могу это сделать?

ufk
источник

Ответы:

168

Если у вас есть более чем последний листовой каталог, который нужно создать, вы можете либо запустить сначала отдельный ssh ... mkdir -p, либо использовать --rsync-pathтрюк, как описано здесь :

rsync -a --rsync-path="mkdir -p /tmp/x/y/z/ && rsync" $source user@remote:/tmp/x/y/z/

Или воспользуйтесь --relativeвариантом, предложенным Тони. В этом случае вы указываете только корень места назначения, который должен существовать, а не структуру каталогов источника, который будет создан:

rsync -a --relative /new/x/y/z/ user@remote:/pre_existing/dir/

Таким образом вы получите / pre_existing / dir / new / x / y / z /

И если вы хотите, чтобы «y / z /» был создан, но не внутри «new / x /», вы можете добавить, ./где вы хотите --relativeначать:

rsync -a --relative /new/x/./y/z/ user@remote:/pre_existing/dir/

создаст / pre_existing / dir / y / z /.

мивк
источник
2
На сервере, к которому я обращаюсь, нет mkdir, поэтому я использую хакер: --rsync-path="echo f > /public/.keep && rsync /public/.keep /public/newfolder/ && rsync" \он создает дополнительный файл, но вы можете удалить его позже.
Фабиано Сориани,
1
Похоже, это не работает с новыми протоколами rsync, я получаю сообщение об ошибке, подобное приведенному ниже, при использовании && или; в --rsync-path недопустимые символы в команде scp! здесь: && / usr / bin / rsync
ghitesh
@ghitesh ты пытался сбежать &&?
Фелипе Альварес
@FelipeAlvarez Да, я работал, но не работал. Я не могу найти ссылку сейчас, но в некоторой документации говорится, что это исправлено, поскольку я считаю, что это могло (и было) использоваться.
ghitesh
Спасибо, это работает. В моем случае я запускал локальный сценарий bash на удаленном сервере и внутри него выполняла команду ssh mkdir, которая выполнялась, но затем убивала остальную часть сценария перед запуском команды rsync. Это позволяет остальной части скрипта работать без проблем.
johndavid400
34

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

ssh user@server mkdir -p existingdir/newdir

если он уже существует, ничего не происходит

Альфредо Йонг
источник
4
Запрос ufk предназначен для синтаксиса, который заставит «rsync создать [отсутствующий целевой] каталог на сервере [&& скопировать файлы]». Ваш ответ действителен в том смысле, что он создаст отсутствующий целевой каталог на сервере ... но rsync, следовательно, без ответа.
TomRoche
Это не вариант, если sshон не поддерживается и rsyncподключается к rsync daemonудаленному концу.
Krzysztof Jabłoński
18

-R, --relativeВариант будет делать это.

Например: если вы хотите сделать резервную копию /var/named/chrootи создать такую ​​же структуру каталогов на удаленном сервере, то это и -Rбудет сделано.

Тони
источник
12
Вы также можете указать только часть пути, который будет создан, используя /./в исходном пути. См. Подробности на странице руководства.
Marki555
23
Зачем голосовать за? Ответ неверный, rsyncкаталоги не будут создаваться автоматически, если целевые папки не существуют. Вздох.
zeekvfu
4
Я настоятельно рекомендую читателям проверить справочную страницу --relative. Это может не делать то, что вы думаете.
FiloSottile
3
--relative указывает полный путь, а не файл, в конечной точке, которую вы указали на сервере. Обычно /tmp/foo/bar/file.c для удаленного: / tmp будет создавать remote: /tmp/file.c, но с -R он создает /tmp/foo/bar/file.c Не используйте эту опцию, если вы знаете, что делаете, вы получите действительно беспорядочную структуру каталогов.
Кормак Малхолл,
7
Комментарий @ Marki555 - ключ к успеху. --relativeв сочетании с /./тем, что будет искать большинство новичков. rsync -avz -e ssh --progress --relative ~/./Desktop/ TARGET_IP:~/скопирует содержимое рабочего стола на целевой рабочий стол. Не знаю, как на это могут повлиять различия в именах пользователей.
Daniel F
15

это сработало для меня:

 rsync /dev/null node:existing-dir/new-dir/

Я получаю это сообщение:

skipping non-regular file "null"

но мне не нужно беспокоиться о том, что вокруг будет висеть пустой каталог.

кдубы
источник
Спасибо за ответ, кдубс. Это отлично сработало. Итак, если я хочу сохранить файлы, которые я синхронизирую, внутри папки, на которую я указываю как источник, мне просто нужно указать ее, и она будет создана. пример: rsync -avph / mytest / / otherfolder / mytest / Затем я получаю вывод «created directory / otherfolder / mytest»
mbrinson
1
Не забудьте косую черту ('/') в конце new-dir, иначе будет создан файл, не являющийся каталогом.
tartaruga_casco_mole
4

Я не думаю, что вы можете сделать это с помощью одной команды rsync, но вы можете сначала «предварительно создать» дополнительный каталог следующим образом:

rsync --recursive emptydir/ destination/newdir

где 'emptydir' - это локальный пустой каталог (который вам может потребоваться сначала создать как временный каталог).

Это что-то вроде хака, но у меня работает.

ура

Крис

Крис Деннис
источник
Нет необходимости использовать временную папку. См. rsync /dev/null node:existing-dir/new-dir/Предложение выше.
lucid_dreamer
3

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

Итак, давайте предположим, что вы перемещаете запись исходного каталога, а не просто перемещаете файлы, содержащиеся в ней.

Предположим, у вас есть каталог, вызываемый локально, data/myappdata/и у вас есть множество подкаталогов под ним. У вас есть data/на целевой машине, но нет data/myappdata/- это достаточно просто:

rsync -rvv /path/to/data/myappdata/ user@host:/remote/path/to/data/myappdata

Вы даже можете использовать другое имя для удаленного каталога:

rsync -rvv --recursive /path/to/data/myappdata user@host:/remote/path/to/data/newdirname

Если вы просто перемещаете некоторые файлы и не перемещаете запись каталога, содержащую их, вы должны сделать:

rsync -rvv /path/to/data/myappdata/*.txt user@host:/remote/path/to/data/myappdata/

и он создаст myappdataдля вас каталог на удаленной машине, в который будут помещены ваши файлы. Опять же, data/каталог должен существовать на удаленной машине.

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

Просто чтобы показать вам, что я получаю при использовании rsync (3.0.9 в Ubuntu 12.04)

$ rsync -rvv *.txt user@remote.machine:/tmp/newdir/
opening connection using: ssh -l user remote.machine rsync --server -vvre.iLsf . /tmp/newdir/
user@remote.machine's password:
sending incremental file list
created directory /tmp/newdir
delta-transmission enabled
bar.txt
foo.txt
total: matches=0  hash_hits=0  false_alarms=0 data=0

Надеюсь, это немного проясняет ситуацию.

Нижняя челюсть79
источник
Это не совсем так, как ожидалось. Я попробовал первую команду, rsync -rvv /path/to/data/myappdata user@host:/remote/path/to/data/myappdataно она создала для цели / remote / path / to / data / myappdata / myappdata /
harleygolfguy
Если я внесу небольшое изменение в вашу первую команду и добавлю косую черту '/' после исходного пути, то это будет работать ... вот так: rsync -rvv /path/to/data/myappdata/ user@host:/remote/path/to/data/myappdata
harleygolfguy
2

например:

из: /xxx/a/b/c/d/e/1.html

кому: user @ remote: /pre_existing/dir/b/c/d/e/1.html

rsync:

cd / xxx / a / && rsync -auvR b / c / d / e / user @ remote: / pre_existing / dir /

Монтаж
источник