Я хотел бы rsync
с локального компьютера на сервер. В директории, которая не существует, и я хочу, чтобы rsync
сначала создавал этот каталог на сервере.
Как я могу это сделать?
Я хотел бы rsync
с локального компьютера на сервер. В директории, которая не существует, и я хочу, чтобы rsync
сначала создавал этот каталог на сервере.
Как я могу это сделать?
Если у вас больше, чем последний каталог листьев, который можно создать, вы можете сначала запустить отдельный 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/
Предполагая, что вы используете ssh для подключения rsync, как насчет отправки команды ssh до:
ssh [email protected] mkdir -p existingdir/newdir
если он уже существует, ничего не происходит
Опция -R, --relative
сделает это.
Например: если вы хотите создать резервную копию /var/named/chroot
и создать ту же структуру каталогов на удаленном сервере, тогда -R
сделает именно это.
это сработало для меня:
rsync /dev/null node:existing-dir/new-dir/
Я получаю это сообщение:
skipping non-regular file "null"
но мне не нужно беспокоиться о том, что существует пустой каталог.
Я не думаю, что вы можете сделать это с помощью одной команды rsync, но вы можете предварительно создать дополнительную директорию следующим образом:
rsync --recursive emptydir/ destination/newdir
где 'emptydir' - это локальная пустая директория (которую вы, возможно, сначала должны создать как временную директорию).
Это немного взломать, но он работает для меня.
веселит
Крис
В этом ответе используются биты других ответов, но, надеюсь, будет немного понятнее об обстоятельствах. Вы никогда не указывали, что вы 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
Надеюсь, это немного облегчит это.
У меня недостаточно комментариев для комментариев.
Ответ, предоставленный @mivk, имеет ловушку, поскольку он отображается в моем браузере с фигурными цитатами, которые не будут работать при копировании дословно. Пожалуйста, отредактируйте:
rsync -a --rsync-path="mkdir -p /tmp/x/y/z/ && rsync" $source [email protected]:/tmp/x/y/z/
например:
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/