rsync: как я могу настроить его для создания целевого каталога на сервере? - PullRequest
123 голосов
/ 28 октября 2009

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

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

Ответы [ 7 ]

126 голосов
/ 07 апреля 2014

Если у вас больше, чем последний конечный каталог, который вы хотите создать, вы можете сначала запустить отдельный 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/.

32 голосов
/ 23 апреля 2013

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

ssh user@server mkdir -p existingdir/newdir

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

14 голосов
/ 28 июля 2013

Опция -R, --relative сделает это.

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

13 голосов
/ 14 марта 2013

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

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

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

skipping non-regular file "null"

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

4 голосов
/ 15 июня 2011

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

rsync --recursive emptydir/ destination/newdir

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

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

ура

Chris

3 голосов
/ 14 января 2014

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

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

Допустим, у вас есть каталог, локально называемый 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/ должен существовать на удаленном компьютере.

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

Просто чтобы показать вам, что я получаю при использовании 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

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

2 голосов
/ 07 апреля 2016

Например:

от: /xxx/a/b/c/d/e/1.html

to: 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 /

...