Come risincronizzare su ssh quando i nomi delle directory hanno spazi


71

Sto provando a risincronizzare da un server all'altro. I server hanno la stessa struttura di directory ma ho problemi a far riconoscere correttamente al server dei telecomandi il nome del percorso sul telecomando quando c'è uno spazio al suo interno.

Ecco i dettagli

La directory locale è

mnt/xlses/split/v2/name with space

La directory remota è

mnt/xlses/split/v2/name with space

Ho provato tutto quello che ho trovato l'ultimo tentativo è stato

rsync --size-only -avzPe ssh  /mnt/xlses/split/v2/name\ with\ space/ root@myserver.com:/mnt/xlses/split/v2/"name with space"

quando viene eseguita la prima cosa che segnala è che sta creando una nuova directory

Lo interrompo e vedo che c'è una nuova directory

mnt/xlses/split/v2/name

tutti i miei file sono in quella directory

Mi aspettavo che fossero presenti

mnt/xlses/split/v2/name with space

Risposte:


8

Provare

rsync --size-only -avzPe ssh /mnt/xlses/split/v2/name\ with\ space root@myserver.com:/mnt/xlses/split/v2/

Ho tolto la barra finale /dal percorso della directory di origine. Questo farà rsynccopiare la directory e tutto il suo contenuto, il che significa che rsyncsi preoccuperà di ottenere il nome corretto sull'host remoto (che sarà) invece di te.


9
Questo non ha funzionato per me, ma la risposta di JohnLate ha fatto.
Adriaan Tijsseling,

Questo non spiega come gestire gli spazi sul lato remoto.
ckujau,

questo non funziona, come notato.
Lizardx,

128

Provare

rsync --protect-args --size-only -avzPe ssh  "/mnt/xlses/split/v2/name with space/ "root@myserver.com:/mnt/xlses/split/v2/name with space"

Da man rsync:

-s, --protect-args

Questa opzione invia tutti i nomi di file e la maggior parte delle opzioni a rsync remoto senza consentire alla shell remota di interpretarli. Ciò significa che gli spazi non sono suddivisi in nomi e che i caratteri speciali non jolly non vengono tradotti (come ~, $,;, &, ecc.). I caratteri jolly vengono espansi sull'host remoto da rsync (invece che dalla shell lo fa). [...]


13
Questo non funziona per Mac.
Matt Alexander,

8
Funziona su Mac se installi una versione recente di rsync usando home-brew.
Adriaan Tijsseling,

4
Verifica se è nella tua versione di rsync eseguendo man rsynce cercando ( /s) "--protect". Per installare con homebrew: brew install homebrew/dupes/rsyncse non trovato esegui brew search rsync.
MikeiLL,

12
L'installazione della nuova versione non è necessaria, basta sfuggire agli spazi E citare l'host / nome file - ad es.rsync -Pavuz 'you@host:~/file\ with\ spaces' ./
ocodo

Questa dovrebbe essere la risposta accettata.
Josh M.

39

Funziona in bash: fuggi gli spazi con la barra rovesciata e usa le virgolette:

rsync -avuz me@some.server.com:"/media/Music/Heavy\ Metal/Witch\ Mountain/*" .

Oppure, se hai il percorso nella variabile $ remote_path, puoi sostituire gli spazi con la sostituzione:

rsync -avuz me@some.server.com:"${remote_path// /\\ }" .

1
Questo ha funzionato per me. Mi ha salvato dal dover lavorare su un server Mac.
George,

1
Questa dovrebbe essere contrassegnata come la risposta corretta. La chiave è che sono necessari sia barre rovesciate che virgolette.
Sridhar Sarnobat,

4
La doppia evasione è una seccatura, l' -sopzione funziona su qualsiasi versione moderna di rsync ed è progettata per risolvere questo problema
Mark K Cowan,

Nota : se stai copiando da un server remoto con uno spazio nel percorso in un percorso locale con spazio, devi solo aggiungere le virgolette al percorso remoto .
lenooh,

La soluzione di @teekarna ha funzionato per me. Secondo la pagina man "rsync", in alternativa usare "--protect-args" o "-s" - che ha funzionato anche per me.
Kishan Parekh,

14

Usa due coppie di virgolette

Non preoccuparti di tutte le barre rovesciate, usa solo virgolette all'interno di virgolette doppie :

ssh me@myserver.com:"'/home/me/test file'" .

Puoi anche usare il contrario, ovvero doppie virgolette all'interno di virgolette singole :

ssh me@myserver.com:'"/home/me/test file"' .

Ulteriori informazioni

Caratteri jolly sul lato server

Se vuoi *che sia interpretato sul server piuttosto che sul client, *devi inserire solo una delle 2 coppie di virgolette. Trovo questo contro-intuitivo perché logicamente la coppia di virgolette esterna sfugge all'interpretazione del client, mentre la coppia di virgolette interna sfugge all'interpretazione del server.

Proteggi Args

Il vantaggio, rispetto alla --protect-argssoluzione , è che in realtà non hai le restrizioni di --protect-args, quindi puoi usare caratteri speciali come ~o$ . Quindi puoi scrivere:

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

o

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

Nota che tilde ( ~) in quest'ultimo esempio deve essere al di fuori delle doppie virgolette.

Puoi mettere una delle coppie di virgolette attorno all'intero nome utente @ host: parte del file (ad es. ssh "me@myserver.com:'/home/me/test file'" .)


In realtà il tuo suggerimento di non mettere la parte host tra virgolette è più perspicace, quindi è allettante fare di questa la prima riga del post.
Sridhar Sarnobat,

2
Questa soluzione è geniale! Funzionava com'era sulla scatola con rsync su ssh.
Ikon,

Quando ci pensate, le 2 coppie di virgolette sono completamente logiche: la coppia di virgolette esterna è in modo che il client la tratta in modo indivisibile (il cui contenuto viene passato al server alla lettera) e la coppia di virgolette interna è per il server riconoscere l'indivisibilità.
Sridhar Sarnobat,

Questa risposta è sottovalutata.
Derple,

6

Capisco che questa è una vecchia domanda, ma ho pensato di aggiungere al corpus di conoscenze esistente.

Ho usato rsynccon più cartelle con spazio e questo funziona. Ho cartelle numerate da 1-10 come segue:

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

Le 2 istanze che vorresti usare rsyncsono locali e remote.

  1. Locale : nota la mancanza di virgolette.

    rsync -avu /media/data/The\ Folder* .
    
  2. Remoto : nota la presenza di virgolette

    rsync -avu -e ssh you@domain.com:"/media/data/The\ Folder*" .
    

3

In generale, cita l'argomento e fuggi dai caratteri spaziali nell'argomento. Nell'esempio che hai fornito, prova:

rsync --size-only -avzPe ssh  "/mnt/xlses/split/v2/name\ with\ space/" "root@myserver.com:/mnt/xlses/split/v2/name\ with\ space"

1

Dalle rsyncmanpage:

   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

0

Bene, risponderò io stesso a questa domanda, anche se qualcun altro potrebbe fare un lavoro migliore nel spiegarlo.

Evidentemente l'installazione sulla macchina di destinazione influenza il modo in cui vengono analizzati gli argomenti e dobbiamo avere qualcosa di impostazione che sta rendendo difficile usare virgolette o barre per sfuggire agli spazi, ma possiamo usare i caratteri jolly quindi ho fatto questo

rsync --size-only -avzPe ssh  /mnt/xlses/split/v2/name\ with\ space/ root@myserver.com:/mnt/xlses/split/v2/name*

Questo funziona per me perché c'è solo una directory che inizia con il nome se avessi più directory non funzionerebbe.

Alla fine ho bisogno di capire come configurare il server remoto in modo che possa analizzare il nome del percorso in modo più efficiente - non uso mai spazi nei nomi di directory ma la persona che ha impostato questo ha fatto e almeno per ora sono bloccato


La proposta funziona solo perché hai già creato la directory di destinazione durante il primo tentativo (non riuscito). Vedi la mia risposta per un modo più semplice (che ha anche il vantaggio di non fare affidamento su un primo tentativo fallito :).
dg99

Bene, in realtà la directory esisteva già. Non sei corretto nel mio tentativo fallito ha creato la directory / ~ / name not / ~ / name con Space I cancellato / ~ / name e ho continuato a provare diverse opzioni La directory / ~ / name con spazio esisteva già Stavo provando ad aggiungere file ad esso
PyNEwbie il

Oh, capisco cosa intendi.
dg99,

Funziona se si citano l'host / percorso e si esce dagli spazi.
ocodo,

0

A seconda della situazione, un'opzione rapida è quella di creare un collegamento simbolico sul sistema remoto:

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

Quindi utilizzare il -Lflag in rsynccui gli dice di seguire il contenuto della directory:

user@local$ rsync -avz -L user@remote:~/name_with_space/ ~/name\ with\ space

Mi piace pensare, ci sono momenti in cui il collegamento simbolico elude la seccatura di una cattiva denominazione o di gerarchie inutilmente complesse.
Sridhar Sarnobat,

0
rsync /mnt/xlses/split/v2/name\\\ with\\\ space/ root@myserver.com:/mnt/xlses/split/v2/name\\\ with\\\ space

funziona anche la doppia fuga


-1

Prova in questo modo:

find /path/ -exec rsync -A -X -av -r -s root@xxxx:/path/ {} \;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.