rsync: como posso configurá-lo para criar um diretório de destino no servidor?

143

Eu gostaria rsyncdo computador local para o servidor. Em um diretório que não existe, e eu quero rsynccriar esse diretório no servidor primeiro.

Como eu posso fazer isso?

ufk
fonte

Respostas:

161

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 /.

mivk
fonte
2
O servidor que estou acessando não possui 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.
Fabiano Soriani
1
Isso não parece estar funcionando nos protocolos rsync mais recentes, recebo um erro semelhante ao seguinte ao usar o && ou; em caracteres inválidos
ghitesh
@ghitesh você tentou escapar do &&?
Felipe Alvarez
@FelipeAlvarez Sim, eu fiz, mas não funcionou. Não consigo encontrar o link agora, mas alguma documentação dizia que isso foi corrigido, pois acredito que poderia (e foi) ser explorado.
ghitesh
Obrigado, isso funciona. No meu caso, eu estava executando um script bash local em um servidor remoto e dentro dele executando o comando ssh mkdir que estava sendo executado, mas depois matando o restante do script antes de executar o comando rsync. Isso permite que o restante do script seja executado sem problemas.
Johndavid400
33

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

Alfredo Yong
fonte
4
A solicitação do ufk é de sintaxe que fará com que "o rsync crie o diretório [um destino ausente] no servidor [&& copie os arquivos]." Sua resposta é válida, pois criará o diretório de destino ausente no servidor ... mas não com rsync, portanto, nenhuma resposta.
TomRoche
Esta não é uma opção se sshnão for suportada e se rsyncconectar à rsync daemonextremidade remota.
Krzysztof Jabłoński
19

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.

Tony
fonte
12
Você também pode especificar apenas parte do caminho a ser criado usando /./o caminho de origem. Veja a página de manual para detalhes.
Marki555
20
Por que votar? A resposta está errada, rsyncnão criará diretórios automaticamente se as pastas de destino não existirem. Suspiro.
Zeekvfu 10/10
3
Eu sugiro fortemente que os leitores consultem a página de manual --relative. Pode não fazer o que você pensa.
FiloSottile
3
--relative adere ao caminho completo, e não ao arquivo, no ponto de extremidade que você fornece no servidor. Normalmente /tmp/foo/bar/file.c para remote: / tmp produziria remote: /tmp/file.c mas com -R ele cria /tmp/foo/bar/file.c Não use esta opção a menos que você Se você souber o que está fazendo, obterá uma estrutura de diretórios bastante confusa.
Cormac Mulhall
7
O comentário de @ Marki555 é a chave para o sucesso. --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.
Daniel F
15

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í.

kdubs
fonte
Obrigado pela resposta kdubs. Isso funcionou muito bem. Portanto, se eu quiser manter os arquivos que estou sincronizando dentro da pasta para a qual estou apontando como fonte, basta especificá-los e eles serão criados. ex: rsync -avph / mytest / / otherfolder / mytest / Então eu recebo a saída "criado diretório / otherfolder / mytest"
mbrinson
1
Não esqueça a barra ('/') no final de new-dir, caso contrário, ele criará um arquivo que não é de diretório.
tartaruga_casco_mole
4

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

Chris Dennis
fonte
Não há necessidade de usar pasta temporária. Veja a rsync /dev/null node:existing-dir/new-dir/sugestão acima.
Lucid_dreamer
3

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

Mandible79
fonte
Isso não funciona exatamente como esperado. Tentei o primeiro comando 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 /
harleygolfguy
Se eu fizer uma pequena alteração no seu primeiro comando e adicionar uma barra '/' após o caminho de origem, ele funcionará ... assim: rsync -rvv /path/to/data/myappdata/ user@host:/remote/path/to/data/myappdata
harleygolfguy
2

por exemplo:

from: /xxx/a/b/c/d/e/1.html

para: usuário @ remoto: /pre_existing/dir/b/c/d/e/1.html

rsync:

cd / xxx / a / && rsync -auvR b / c / d / e / user @ remote: / pré-existente / dir /

Montagem
fonte