Respostas:
Se você tiver mais do que o último diretório folha a ser criado, poderá executar um ssh ... mkdir -pprimeiro separado ou usar o --rsync-pathtruque, conforme explicado aqui :
rsync -a --rsync-path="mkdir -p /tmp/x/y/z/ && rsync" $source user@remote:/tmp/x/y/z/
Ou use a --relativeopçã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 --relativecomeç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.
sshnão for suportada e se rsyncconectar à rsync daemonextremidade remota.
A -R, --relativeopção fará isso.
Por exemplo: se você deseja fazer backup /var/named/chroote criar a mesma estrutura de diretório no servidor remoto, -Rfará exatamente isso.
/./o caminho de origem. Veja a página de manual para detalhes.
rsyncnão criará diretórios automaticamente se as pastas de destino não existirem. Suspiro.
--relative. Pode não fazer o que você pensa.
--relativeem 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 myappdatadiretó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 -rvvflag é 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.