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


151

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

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

Ответы:


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

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


Это не совсем так, как ожидалось. Я попробовал первую команду, 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 /

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.