Como rsync sobre ssh quando nomes de diretórios possuem espaços

53

Estou tentando rsync de um servidor para outro. Os servidores têm a mesma estrutura de diretórios, mas estou tendo problemas para fazer com que o servidor remotos reconheça adequadamente o nome do caminho no remoto quando há um espaço nele.

Aqui estão os detalhes

O diretório local é

mnt/xlses/split/v2/name with space

O diretório remoto é

mnt/xlses/split/v2/name with space

Eu tentei tudo o que posso encontrar a última tentativa foi

rsync --size-only -avzPe ssh  /mnt/xlses/split/v2/name\ with\ space/ [email protected]:/mnt/xlses/split/v2/"name with space"

quando isso é executado, a primeira coisa que informa é que está criando um novo diretório

Eu o interrompo e vejo que há um novo diretório

mnt/xlses/split/v2/name

todos os meus arquivos estão nesse diretório

Eu esperava que eles estivessem em

mnt/xlses/split/v2/name with space
    
por PyNEwbie 10.12.2013 / 22:48

11 respostas

6

Tente

rsync --size-only -avzPe ssh /mnt/xlses/split/v2/name\ with\ space [email protected]:/mnt/xlses/split/v2/

Eu tirei a barra à direita / do caminho do diretório de origem. Isso fará com que rsync copie o diretório e todo o seu conteúdo, o que significa que rsync se preocupará em obter o nome correto no host remoto (o que ele será) em vez de você.

    
por 11.12.2013 / 00:00
105

Tente

rsync --protect-args --size-only -avzPe ssh  "/mnt/xlses/split/v2/name with space/ "[email protected]:/mnt/xlses/split/v2/name with space"

De man rsync :

-s, --protect-args

This option sends all filenames and most options to the remote rsync without allowing the remote shell to interpret them. This means that spaces are not split in names, and any non-wildcard special characters are not translated (such as ~, $, ;, &, etc.). Wildcards are expanded on the remote host by rsync (instead of the shell doing it). [...]

    
por 15.06.2014 / 20:46
24

Isso funciona no bash: escape dos espaços com contrabarra e use aspas:

rsync -avuz [email protected]:"/media/Music/Heavy\ Metal/Witch\ Mountain/*" .

Ou se você tiver o caminho na variável $ remote_path, os espaços podem ser escapados com a substituição:

rsync -avuz [email protected]:"${remote_path// /\ }" .
    
por 10.08.2015 / 04:17
5

Use dois pares de citações

Não se preocupe com todas as barras invertidas, apenas use aspas simples entre aspas duplas :

ssh [email protected]:"'/home/me/test file'" .

Você também pode usar o reverso, ou seja, aspas duplas entre aspas simples :

ssh [email protected]:'"/home/me/test file"' .

Mais informações

A vantagem, comparada com a --protect-args solution , é que você não tem as restrições do --protect-args , então você pode usar caracteres especiais, como ~ ou $ . Então você pode escrever:

rsync host:'"$HOME/test file"' .

ou

rsync host:'~"/test file"' .

Note que o til ( ~ ) no último exemplo precisa estar fora das aspas duplas.

Você pode colocar um dos pares de aspas ao redor de todo o nome de usuário @ host: parte do arquivo (por exemplo, ssh "[email protected]:'/home/me/test file'" . )

    
por 05.01.2018 / 06:40
4

Eu entendo que essa é uma pergunta antiga, mas eu pensei em acrescentar ao corpo de conhecimento existente.

Eu usei rsync com várias pastas com espaço e isso funciona. Eu tenho pastas numeradas de 1-10 da seguinte forma:

  • The\ Folder1
  • The\ Folder2
  • The\ Folder3
  • ..
  • The\ Folder10

As duas instâncias que você deseja usar rsync são locais e remotas.

  1. Local - Observe a falta de citações.

    rsync -avu /media/data/The\ Folder* .
    
  2. Remoto - Observe a presença de citações

    rsync -avu -e ssh [email protected]:"/media/data/The\ Folder*" .
    
por 01.03.2016 / 01:38
3

De um modo geral, cite o argumento e escape dos caracteres espaciais do argumento. No exemplo que você deu, tente:

rsync --size-only -avzPe ssh  "/mnt/xlses/split/v2/name\ with\ space/" "[email protected]:/mnt/xlses/split/v2/name\ with\ space"
    
por 23.02.2016 / 14:23
1

A partir das% man_de% manpages:

   If you need to transfer a filename  that  contains  whitespace,  you  can
   either  specify  the --protect-args (-s) option, or you'll need to escape
   the whitespace in a way that  the  remote  shell  will  understand.   For
   instance:

          rsync -av host:'file\ name\ with\ spaces' /dest
    
por 01.08.2018 / 22:38
0

Bem, eu mesmo vou responder a essa pergunta, embora alguém possa fazer um trabalho melhor explicando isso.

Evidentemente, a configuração na máquina de destino afeta o modo como os argumentos são analisados e precisamos ter algo configurado que dificulte o uso de aspas ou barras para escapar de espaços, mas podemos usar curingas para que eu faça isso

rsync --size-only -avzPe ssh  /mnt/xlses/split/v2/name\ with\ space/ [email protected]:/mnt/xlses/split/v2/name*

Isso funciona para mim porque existe apenas um diretório que começa com nome se eu tivesse vários diretórios, isso não funcionaria.

Em suma, preciso entender como configurar o servidor remoto para que ele possa analisar o nome do caminho com mais eficiência. Nunca uso espaços em nomes de diretório, mas a pessoa que configurou isso fez e, pelo menos por enquanto, estou presa

    
por 10.12.2013 / 23:56
0

Dependendo da situação, uma opção rápida é criar um symlink no sistema remoto:

user@remote$ ln -s ~/name\ with\ space/ ~/name_with_space

Em seguida, use o -L flag em rsync , que diz para seguir o conteúdo do diretório:

user@local$ rsync -avz -L user@remote:~/name_with_space/ ~/name\ with\ space
    
por 19.08.2015 / 21:32
0
rsync /mnt/xlses/split/v2/name\\ with\\ space/ [email protected]:/mnt/xlses/split/v2/name\\ with\\ space

double escape também funciona

    
por 17.10.2016 / 08:19
-1

Tente desta maneira:

find /path/ -exec rsync -A -X -av -r -s root@xxxx:/path/ {} \;
    
por 12.12.2014 / 10:32

Tags