Jak wykonać synchronizację przez ssh, gdy w nazwach katalogów znajdują się spacje

71

Próbuję zsynchronizować rsync z jednego serwera na drugi. Serwery mają tę samą strukturę katalogów, ale mam problem z tym, aby serwer pilotów prawidłowo rozpoznał nazwę ścieżki na pilocie, gdy jest w nim miejsce.

Oto szczegóły

Katalog lokalny to

mnt/xlses/split/v2/name with space

Zdalny katalog to

mnt/xlses/split/v2/name with space

Próbowałem wszystkiego, co udało mi się znaleźć

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

kiedy to uruchamia pierwszą rzeczą, którą zgłasza, jest to, że tworzy nowy katalog

Przerywam i widzę, że jest nowy katalog

mnt/xlses/split/v2/name

wszystkie moje pliki znajdują się w tym katalogu

Spodziewałem się ich

mnt/xlses/split/v2/name with space
PyNEwbie
źródło

Odpowiedzi:

8

Próbować

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

Zdjąłem końcowy ukośnik /ze ścieżki katalogu źródłowego. Spowoduje to rsyncskopiowanie katalogu i całej jego zawartości, co oznacza, że rsyncbędziesz się martwić o poprawną nazwę na zdalnym hoście (co będzie) zamiast ciebie.

dg99
źródło
9
Nie działało to dla mnie, ale odpowiedź johnLate się sprawdziła.
Adriaan Tijsseling,
To nie wyjaśnia, jak radzić sobie ze spacjami po drugiej stronie.
ckujau
to nie działa, jak wspomniano.
Lizardx
128

Próbować

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

Od man rsync:

-s, --protect-args

Ta opcja wysyła wszystkie nazwy plików i większość opcji do zdalnego rsync, nie pozwalając zdalnej powłoce na ich interpretację. Oznacza to, że spacje nie są dzielone na nazwy, a znaki specjalne, które nie są symbolami wieloznacznymi, nie są tłumaczone (takie jak ~, $,;, itp.). Symbole wieloznaczne są rozszerzane na zdalnym hoście przez rsync (zamiast robiącej to powłoki). [...]

johnLate
źródło
13
To nie działa na Macu.
Matt Alexander
8
Działa na komputerze Mac, jeśli zainstalujesz najnowszą wersję rsync przy użyciu home-brew.
Adriaan Tijsseling,
4
Sprawdź, czy jest w twojej wersji rsync, uruchamiając man rsynci wyszukując ( /s) dla „--protect”. Aby zainstalować z Homebrew: brew install homebrew/dupes/rsyncJeśli nie znaleziono, uruchom brew search rsync.
MikeiLL
12
Instalacja nowej wersji jest niepotrzebna, po prostu rsync -Pavuz 'you@host:~/file\ with\ spaces' ./
unikasz
To powinna być zaakceptowana odpowiedź.
Josh M.
38

Działa to w bash: Escape the space with backslash, a następnie użyj cudzysłowów:

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

Lub jeśli masz ścieżkę w zmiennej $ remote_path, spacje mogą być zastępowane przez podstawienie:

rsync -avuz [email protected]:"${remote_path// /\\ }" .
teekarna
źródło
1
To działało dla mnie. Uratowało mnie od konieczności pracy na serwerze Mac.
George,
1
Należy zaznaczyć prawidłową odpowiedź. Kluczem jest to, że potrzebujesz zarówno odwrotnych ukośników, jak i cudzysłowów.
Sridhar Sarnobat
4
Podwójne uciekanie jest uciążliwe, -sopcja działa na każdej nowoczesnej wersji rsync i ma na celu rozwiązanie tego problemu
Mark K Cowan
Uwaga : Jeśli kopiujesz z serwera zdalnego z miejscem w drodze do lokalnej drogi z miejsca, to tylko trzeba dodać cytaty do zdalnej ścieżki .
lenooh
Rozwiązanie @teekarna działało dla mnie. Zgodnie ze stroną podręcznika „rsync” alternatywnie jest użycie „--protect-args” lub „-s” - to też dla mnie zadziałało.
Kishan Parekh
14

Użyj dwóch par cytatów

Nie przejmuj się wszystkimi odwrotnymi ukośnikami, po prostu użyj pojedynczych cudzysłowów wewnątrz podwójnych cudzysłowów :

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

Możesz także użyć odwrotności, czyli podwójnych cudzysłowów w pojedynczych cudzysłowach :

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

Dalsze informacje

Symbole wieloznaczne po stronie serwera

Jeśli chcesz, *aby interpretacja odbywała się na serwerze, a nie na kliencie, *musisz wpisać tylko jedną z 2 par cytatów. Uważam, że jest to sprzeczne z intuicją, ponieważ logicznie zewnętrzna para cytatów unika interpretacji klienta, podczas gdy wewnętrzna para cytatów ucieka od interpretacji serwera.

Chroń argumenty

Zaletą w porównaniu z --protect-argsrozwiązaniem jest to, że tak naprawdę nie masz ograniczeń --protect-args, więc możesz używać znaków specjalnych, takich jak ~lub$ . Możesz więc napisać:

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

lub

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

Zauważ, że tylda ( ~) w drugim przykładzie musi znajdować się poza podwójnymi cudzysłowami.

Możesz umieścić jedną z par cytatów wokół całej nazwy użytkownika @ host: część pliku (np. ssh "[email protected]:'/home/me/test file'" .)

Sridhar Sarnobat
źródło
W rzeczywistości twoja sugestia, aby w ogóle nie umieszczać części głównej w cytatach, jest bardziej wnikliwa, więc kuszące jest uczynienie tego pierwszym wierszem postu.
Sridhar Sarnobat
2
To rozwiązanie jest genialne! Działa jak na puszce z rsync nad ssh.
Ikon
Kiedy myślisz o tym, dwie pary cytatów są całkowicie logiczne: zewnętrzna para cytatów jest taka, że ​​klient traktuje ją niepodzielnie (której zawartość jest przekazywana dosłownie do serwera), a wewnętrzna para cytatów jest dla serwera rozpoznać niepodzielność.
Sridhar Sarnobat,
Ta odpowiedź jest niedoceniana.
Derple
6

Rozumiem, że to stare pytanie, ale pomyślałem, że uzupełnię istniejącą wiedzę.

Korzystałem rsyncz wielu folderów ze spacją i to działa. Mam foldery o numerach od 1 do 10 w następujący sposób:

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

2 instancje, których chcesz użyć, rsyncsą lokalne i zdalne.

  1. Lokalne - zwróć uwagę na brak cytatów.

    rsync -avu /media/data/The\ Folder* .
    
  2. Zdalne - Zwróć uwagę na obecność cytatów

    rsync -avu -e ssh [email protected]:"/media/data/The\ Folder*" .
    
Gokul Wimalanathan
źródło
3

Mówiąc ogólnie, zacytuj argument i unikaj spacji w argumencie. W podanym przykładzie spróbuj:

rsync --size-only -avzPe ssh  "/mnt/xlses/split/v2/name\ with\ space/" "[email protected]:/mnt/xlses/split/v2/name\ with\ space"
James
źródło
1

Ze stron 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
Shammel Lee
źródło
0

Cóż, sam odpowiem na to pytanie, chociaż ktoś inny mógłby lepiej to wyjaśnić.

Oczywiście konfiguracja na maszynie docelowej wpływa na sposób analizowania argumentów i musimy mieć coś, co utrudnia użycie cudzysłowów lub ukośników, aby uciec od spacji, ale możemy użyć symboli wieloznacznych, więc zrobiłem to

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

Działa to dla mnie, ponieważ istnieje tylko jeden katalog, który zaczyna się od nazwy, gdybym miał wiele katalogów, to nie działałoby.

Ostatecznie muszę zrozumieć, jak skonfigurować serwer zdalny, aby mógł wydajniej analizować nazwę ścieżki - nigdy nie używam spacji w nazwach katalogów, ale osoba, która to skonfigurowała, zrobiła to i przynajmniej na razie utknąłem

PyNEwbie
źródło
Twoja propozycja działa tylko dlatego, że już utworzyłeś katalog docelowy podczas pierwszej (nieudanej) próby. Zobacz moją odpowiedź na łatwiejszy sposób (ma tę zaletę, że nie polega na nieudanej pierwszej próbie :).
dg99
Właściwie katalog już istniał. Nie masz racji w mojej nieudanej próbie utworzenia katalogu / ~ / name not / ~ / name ze Spacją usunąłem / ~ / name i próbowałem różnych opcji Katalog / ~ / name ze spacją już istnieje Próbowałem dodać pliki do tego
PyNEwbie,
Och, rozumiem co masz na myśli.
dg99
Działa, jeśli zacytujesz host / ścieżkę, a także unikasz spacji.
ocodo
0

W zależności od sytuacji szybką opcją jest utworzenie dowiązania symbolicznego w zdalnym systemie:

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

Następnie użyj -Lflagi, w rsyncktórej nakazuje śledzenie zawartości katalogu:

user@local$ rsync -avz -L user@remote:~/name_with_space/ ~/name\ with\ space
Chris Laskey
źródło
Podoba mi się myślenie, że czasami symlinkowanie omija kłopoty związane z niewłaściwym nazywaniem lub niepotrzebnie złożonymi hierarchiami.
Sridhar Sarnobat
0
rsync /mnt/xlses/split/v2/name\\\ with\\\ space/ [email protected]:/mnt/xlses/split/v2/name\\\ with\\\ space

działa również podwójna ucieczka

Andrej Surkov
źródło
-1

Wypróbuj w ten sposób:

find /path/ -exec rsync -A -X -av -r -s root@xxxx:/path/ {} \;
użytkownik94712
źródło