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/ root@myserver.com:/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

Odpowiedzi:


8

Próbować

rsync --size-only -avzPe ssh /mnt/xlses/split/v2/name\ with\ space root@myserver.com:/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.


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/ "root@myserver.com:/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). [...]


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 me@some.server.com:"/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 me@some.server.com:"${remote_path// /\\ }" .

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 me@myserver.com:"'/home/me/test file'" .

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

ssh me@myserver.com:'"/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 "me@myserver.com:'/home/me/test file'" .)


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 you@domain.com:"/media/data/The\ Folder*" .
    

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/" "root@myserver.com:/mnt/xlses/split/v2/name\ with\ space"

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

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/ root@myserver.com:/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


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

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/ root@myserver.com:/mnt/xlses/split/v2/name\\\ with\\\ space

działa również podwójna ucieczka


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.