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

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

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

Ответ 1

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

rsync -a --rsync-path="mkdir -p /tmp/x/y/z/ && rsync" $source [email protected]:/tmp/x/y/z/

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

rsync -a --relative /new/x/y/z/ [email protected]:/pre_existing/dir/

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

Ответ 2

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

ssh [email protected] mkdir -p existingdir/newdir

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

Ответ 3

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

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

Ответ 4

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

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

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

skipping non-regular file "null"

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

Ответ 5

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

rsync --recursive emptydir/ destination/newdir

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

Это немного взломать, но он работает для меня.

веселит

Крис

Ответ 6

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

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

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

rsync -rvv /path/to/data/myappdata [email protected]:/remote/path/to/data/myappdata

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

rsync -rvv --recursive /path/to/data/myappdata [email protected]:/remote/path/to/data/newdirname

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

rsync -rvv /path/to/data/myappdata/*.txt [email protected]:/remote/path/to/data/myappdata/

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

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

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

$ rsync -rvv *.txt [email protected]:/tmp/newdir/
opening connection using: ssh -l user remote.machine rsync --server -vvre.iLsf . /tmp/newdir/
[email protected] 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

Надеюсь, это немного облегчит это.

Ответ 7

У меня недостаточно комментариев для комментариев.

Ответ, предоставленный @mivk, имеет ловушку, поскольку он отображается в моем браузере с фигурными цитатами, которые не будут работать при копировании дословно. Пожалуйста, отредактируйте:

rsync -a --rsync-path="mkdir -p /tmp/x/y/z/ && rsync" $source [email protected]:/tmp/x/y/z/

Ответ 8

например:

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