Respostas:
Se você tiver mais do que o último diretório folha a ser criado, poderá executar um ssh ... mkdir -p
primeiro separado ou usar o --rsync-path
truque, conforme explicado aqui :
rsync -a --rsync-path="mkdir -p /tmp/x/y/z/ && rsync" $source user@remote:/tmp/x/y/z/
Ou use a --relative
opção sugerida por Tony. Nesse caso, você especifica apenas a raiz do destino, que deve existir, e não a estrutura de diretórios da fonte, que será criada:
rsync -a --relative /new/x/y/z/ user@remote:/pre_existing/dir/
Dessa forma, você terminará com / pre_existing / dir / new / x / y / z /
E se você deseja ter "y / z /" criado, mas não dentro de "new / x /", você pode adicionar ./
onde deseja --relative
começar:
rsync -a --relative /new/x/./y/z/ user@remote:/pre_existing/dir/
criaria / pré-existente / dir / y / z /.
&&
?
Supondo que você esteja usando o ssh para conectar o rsync, que tal enviar um comando ssh antes:
ssh user@server mkdir -p existingdir/newdir
se já existe, nada acontece
rsync
, portanto, nenhuma resposta.
ssh
não for suportada e se rsync
conectar à rsync daemon
extremidade remota.
A -R, --relative
opção fará isso.
Por exemplo: se você deseja fazer backup /var/named/chroot
e criar a mesma estrutura de diretório no servidor remoto, -R
fará exatamente isso.
/./
o caminho de origem. Veja a página de manual para detalhes.
rsync
não criará diretórios automaticamente se as pastas de destino não existirem. Suspiro.
--relative
. Pode não fazer o que você pensa.
--relative
em conjunto com o /./
que a maioria dos novatos estará procurando. rsync -avz -e ssh --progress --relative ~/./Desktop/ TARGET_IP:~/
copiará o conteúdo da área de trabalho na área de trabalho de destino. Não sei como as diferenças nos nomes de usuários podem afetar isso.
isso funcionou para mim:
rsync /dev/null node:existing-dir/new-dir/
Eu recebo esta mensagem:
skipping non-regular file "null"
mas não preciso me preocupar em ter um diretório vazio por aí.
Eu não acho que você pode fazê-lo com um comando rsync, mas você pode 'pré-criar' o diretório extra primeiro assim:
rsync --recursive emptydir/ destination/newdir
onde 'emptydir' é um diretório vazio local (que você pode ter que criar primeiro como um diretório temporário).
É um pouco complicado, mas funciona para mim.
Felicidades
Chris
rsync /dev/null node:existing-dir/new-dir/
sugestão acima.
Essa resposta usa pedaços de outras respostas, mas espero que seja um pouco mais claro quanto às circunstâncias. Você nunca especificou o que estava sincronizando - uma única entrada de diretório ou vários arquivos.
Então, vamos supor que você esteja movendo uma entrada do diretório de origem e não apenas movendo os arquivos contidos nela.
Digamos que você tenha um diretório chamado localmente data/myappdata/
e você tenha uma carga de subdiretórios por baixo disso. Você tem data/
na sua máquina alvo, mas não data/myappdata/
- isso é fácil:
rsync -rvv /path/to/data/myappdata/ user@host:/remote/path/to/data/myappdata
Você pode até usar um nome diferente para o diretório remoto:
rsync -rvv --recursive /path/to/data/myappdata user@host:/remote/path/to/data/newdirname
Se você está apenas movendo alguns arquivos e não movendo a entrada de diretório que os contém, então você faria:
rsync -rvv /path/to/data/myappdata/*.txt user@host:/remote/path/to/data/myappdata/
e criará o myappdata
diretório para você na máquina remota para colocar seus arquivos. Novamente, o data/
diretório deve existir na máquina remota.
Aliás, meu uso de -rvv
flag é obter resultados duplamente detalhados, para que fique claro o que faz, bem como o comportamento recursivo necessário.
Apenas para mostrar o que recebo ao usar o rsync (3.0.9 no 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
Espero que isso esclareça isso um pouco.
rsync -rvv /path/to/data/myappdata user@host:/remote/path/to/data/myappdata
, mas o que ele criou no alvo é / remote / path / to / data / myappdata / myappdata /
rsync -rvv /path/to/data/myappdata/ user@host:/remote/path/to/data/myappdata
mkdir
, por isso estou usando o hack:--rsync-path="echo f > /public/.keep && rsync /public/.keep /public/newfolder/ && rsync" \
ele cria um arquivo extra, mas você pode removê-lo mais tarde.