desenv-web-rp.com

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

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
81
PyNEwbie

Tentar

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 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 (que será) em vez de você.

8
dg99

Tentar

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

Esta 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 que não são curingas não são traduzidos (como ~, $,;, &, etc.). Os curingas são expandidos no host remoto pelo rsync (em vez do Shell fazendo isso). [...]

146
johnLate

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ê tiver o caminho na variável $ remote_path, os espaços poderão ser escapados com a substituição:

rsync -avuz [email protected]:"${remote_path// /\\ }" .
42
teekarna

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ê quer um * para ser interpretado no servidor e não no cliente, o * deve aparecer 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, em comparação com o --protect-args solução , é que você realmente 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"' .

Observe que o til (~) no último exemplo precisa ser fora as 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'" .)

19
Sridhar Sarnobat

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

Eu usei rsync com 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 rsync são locais e remotas.

  1. Local - Observe a falta de aspas.

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

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

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"
3
James

Nas páginas de manual rsync:

   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
1
Shammel Lee

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

[email protected]$ ln -s ~/name\ with\ space/ ~/name_with_space

Então use o -L sinalizador em rsync que diz para seguir o conteúdo do diretório:

[email protected]$ rsync -avz -L [email protected]:~/name_with_space/ ~/name\ with\ space
0
Chris Laskey

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 há apenas um diretório que começa com 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

0
PyNEwbie
rsync /mnt/xlses/split/v2/name\\\ with\\\ space/ [email protected]:/mnt/xlses/split/v2/name\\\ with\\\ space

escape duplo também funciona

0
Andrej Surkov