Я хочу перейти rsync
с локального компьютера на сервер. В каталоге, который не существует, и я хочу rsync
сначала создать этот каталог на сервере.
Как я могу это сделать?
Ответы:
Если у вас есть более чем последний листовой каталог, который нужно создать, вы можете либо запустить сначала отдельный 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 /.
&&
?
Предполагая, что вы используете ssh для подключения rsync, как насчет отправки команды ssh раньше:
ssh user@server mkdir -p existingdir/newdir
если он уже существует, ничего не происходит
rsync
, следовательно, без ответа.
ssh
он не поддерживается и rsync
подключается к rsync daemon
удаленному концу.
-R, --relative
Вариант будет делать это.
Например: если вы хотите сделать резервную копию /var/named/chroot
и создать такую же структуру каталогов на удаленном сервере, то это и -R
будет сделано.
/./
в исходном пути. См. Подробности на странице руководства.
rsync
каталоги не будут создаваться автоматически, если целевые папки не существуют. Вздох.
--relative
. Это может не делать то, что вы думаете.
--relative
в сочетании с /./
тем, что будет искать большинство новичков. rsync -avz -e ssh --progress --relative ~/./Desktop/ TARGET_IP:~/
скопирует содержимое рабочего стола на целевой рабочий стол. Не знаю, как на это могут повлиять различия в именах пользователей.
это сработало для меня:
rsync /dev/null node:existing-dir/new-dir/
Я получаю это сообщение:
skipping non-regular file "null"
но мне не нужно беспокоиться о том, что вокруг будет висеть пустой каталог.
Я не думаю, что вы можете сделать это с помощью одной команды rsync, но вы можете сначала «предварительно создать» дополнительный каталог следующим образом:
rsync --recursive emptydir/ destination/newdir
где 'emptydir' - это локальный пустой каталог (который вам может потребоваться сначала создать как временный каталог).
Это что-то вроде хака, но у меня работает.
ура
Крис
rsync /dev/null node:existing-dir/new-dir/
Предложение выше.
В этом ответе используются кусочки других ответов, но, надеюсь, он будет немного яснее относительно обстоятельств. Вы никогда не указали, что вы синхронизируете - одну запись в каталоге или несколько файлов.
Итак, давайте предположим, что вы перемещаете запись исходного каталога, а не просто перемещаете файлы, содержащиеся в ней.
Предположим, у вас есть каталог, вызываемый локально, 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
flag для получения вдвойне подробного вывода, чтобы было понятно, что он делает, а также необходимое рекурсивное поведение.
Просто чтобы показать вам, что я получаю при использовании 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 /
rsync -rvv /path/to/data/myappdata/ user@host:/remote/path/to/data/myappdata
mkdir
, поэтому я использую хакер:--rsync-path="echo f > /public/.keep && rsync /public/.keep /public/newfolder/ && rsync" \
он создает дополнительный файл, но вы можете удалить его позже.