Como rsync sobre ssh quando os nomes de diretório têm espaços

71

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 de controle remoto reconheça adequadamente o nome do caminho no controle remoto quando houver 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 de tudo que encontrei, 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 ele 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

mnt/xlses/split/v2/name with space
PyNEwbie
fonte

Respostas:

8

Experimentar

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

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

dg99
fonte
9
Isso não funcionou para mim, mas a resposta de johnLate funcionou.
Adriaan Tijsseling
Isso não explica como lidar com espaços no lado remoto.
precisa saber é o seguinte
isso não funciona, como observado.
Lizardx
128

Experimentar

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

Essa opção envia todos os nomes de arquivos e a maioria das opções para o rsync remoto sem permitir que o shell remoto os interprete. Isso significa que os espaços não são divididos em nomes e os caracteres especiais não curinga não são traduzidos (como ~, $,;, &, etc.). Os curingas são expandidos no host remoto pelo rsync (em vez do shell fazer isso). [...]

johnLate
fonte
13
Isso não funciona no Mac.
Matt Alexander
8
Funciona no Mac se você instalar uma versão recente do rsync usando o home-brew.
Adriaan Tijsseling
4
Veja se está na sua versão do rsync executando man rsynce pesquisando ( /s) por "--protect". Para instalar com o homebrew: brew install homebrew/dupes/rsyncSe não for encontrado, execute brew search rsync.
precisa saber é o seguinte
12
A instalação da nova versão é desnecessária, você apenas rsync -Pavuz 'you@host:~/file\ with\ spaces' ./
abre
Essa deve ser a resposta aceita.
Josh M.
39

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

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

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

rsync -avuz [email protected]:"${remote_path// /\\ }" .
teekarna
fonte
11
Isso funcionou para mim. Me salvou de ter que trabalhar em um servidor Mac.
George
11
Isso deve ser marcado como a resposta correta. A chave é que você precisa de barras invertidas e aspas.
Sridhar Sarnobat
4
Duplo-escaping é uma dor, a -sopção funciona em qualquer versão moderna do rsync e é projetado para resolver este problema
Mark K Cowan
Nota : se você está copiando a partir de um servidor remoto com um espaço no caminho para um caminho local com espaço, você unicamente precisa adicionar as aspas para o caminho remoto .
Lenooh # 2/10
A solução da @teekarna funcionou para mim. De acordo com a página do manual "rsync", a alternativa é usar "--protect-args" ou "-s" - que também funcionou para mim.
Kishan Parekh
14

Use dois pares de aspas

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

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

Você também pode usar o inverso, ou seja, aspas duplas dentro de aspas simples :

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

Mais informações

Curingas no lado do servidor

Se você deseja que um *seja interpretado no servidor e não no cliente, ele *deve estar dentro de apenas um dos 2 pares de aspas. Acho isso contra-intuitivo, porque logicamente o par externo de aspas escapa à interpretação do cliente, enquanto o par interno de aspas escapa à interpretação do servidor.

Proteger Args

A vantagem, comparada à --protect-argssolução , é que você realmente não possui as restrições do --protect-args, portanto, pode usar caracteres especiais como ~ou$ . Então você pode escrever:

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

ou

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

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

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

Sridhar Sarnobat
fonte
Na verdade, sua sugestão de não colocar a parte do host entre aspas é mais perspicaz, por isso é tentador fazer dessa a primeira linha do post.
Sridhar Sarnobat
2
Esta solução é brilhante! Trabalhou como estava na lata com rsync sobre ssh.
Ikon
Quando você pensa sobre isso, os 2 pares de cotações são completamente lógicos: o par externo de cotações é para que o cliente o trate de forma indivisível (cujo conteúdo é passado para o servidor literalmente) e o par interno de cotações é para o servidor reconhecer a indivisibilidade.
Sridhar Sarnobat 12/10
Esta resposta é subestimada.
Derple
6

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

Eu usei rsynccom várias pastas com espaço e isso funciona. Tenho pastas numeradas de 1 a 10 da seguinte maneira:

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

As 2 instâncias que você deseja usar rsyncsão locais e remotas.

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

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

    rsync -avu -e ssh [email protected]:"/media/data/The\ Folder*" .
    
Gokul Wimalanathan
fonte
3

De um modo geral, cite o argumento e escape dos caracteres de espaço no 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"
James
fonte
1

Das rsyncpáginas de manual:

   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
Shammel Lee
fonte
0

Bem, eu mesmo vou responder a essa pergunta, embora alguém possa fazer um trabalho melhor para explicá-la.

Evidentemente, a configuração na máquina de destino afeta a maneira como os argumentos são analisados ​​e devemos ter algo que dificulte o uso de aspas ou barras para escapar de espaços, mas podemos usar curingas, então fiz 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 o nome, se eu tivesse vários diretórios, isso não funcionaria.

Por fim, preciso entender como configurar o servidor remoto para que ele possa analisar o nome do caminho com mais eficiência - nunca uso espaços nos nomes de diretório, mas a pessoa que o configurou o fez e, pelo menos por enquanto, estou presa

PyNEwbie
fonte
Sua proposta só funciona porque você já criou o diretório de destino durante sua primeira tentativa (sem êxito). Veja minha resposta para uma maneira mais fácil (que também tem a vantagem de não confiar em uma primeira tentativa com falha :).
Dg99
Bem, na verdade o diretório já existia. Você não está correto na minha tentativa fracassada de criar o diretório / ~ / name not / ~ / name com espaço que apaguei / ~ / name e continuei tentando opções diferentes O diretório / ~ / name com espaço já existia Eu estava tentando adicionar arquivos a ele
PyNEwbie
Oh, entendo o que você quer dizer.
Dg99
Funciona se você citar o host / caminho, além de escapar dos espaços.
ocodo 11/12/15
0

Dependendo da situação, uma opção rápida é criar um link simbólico no sistema remoto:

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

Em seguida, use o -Lsinalizador no rsyncqual ele diz para seguir o conteúdo do diretório:

user@local$ rsync -avz -L user@remote:~/name_with_space/ ~/name\ with\ space
Chris Laskey
fonte
Eu gosto do pensamento, há momentos em que o simbolismo ignora o incômodo de nomear incorretamente ou hierarquias desnecessariamente complexas.
Sridhar Sarnobat
0
rsync /mnt/xlses/split/v2/name\\\ with\\\ space/ [email protected]:/mnt/xlses/split/v2/name\\\ with\\\ space

escape duplo também funciona

Andrej Surkov
fonte
-1

Tente desta maneira:

find /path/ -exec rsync -A -X -av -r -s root@xxxx:/path/ {} \;
user94712
fonte