Dizin adlarında boşluk olduğunda ssh üzerinde rsync nasıl kullanılır


71

Bir sunucudan diğerine rsync yapmaya çalışıyorum. Sunucular aynı dizin yapısına sahip ancak uzaktan kumandadaki bir yol olduğunda uzaktan kumandadaki yol adını doğru şekilde tanıması için uzaktan kumanda sunucusunu alma konusunda sorun yaşıyorum.

İşte detaylar

Yerel dizin

mnt/xlses/split/v2/name with space

Uzak dizin

mnt/xlses/split/v2/name with space

Son girişimi bulabildiğim her şeyi denedim.

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

Bu rapor çalıştığı ilk şey çalıştığında yeni bir dizin yaratıyor olmasıdır

Keserim ve yeni bir dizin olduğunu görürüm

mnt/xlses/split/v2/name

dosyalarımın tümü o dizinde

Onları içeride bekliyordum

mnt/xlses/split/v2/name with space

Yanıtlar:


8

Deneyin

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

/Kaynak dizin yolundaki sondaki kesik çizgiyi çıkardım . Bu rsync, dizinin ve tüm içeriğinin kopyalanmasını sağlar; bu rsync, adı yerine uzak ana bilgisayarda (ki olacak) adı doğru bir şekilde almaktan endişe edecektir.


9
Bu benim için işe yaramadı ama johnLate tarafından cevap yaptı.
Adriaan Tijssel,

Bu, uzak taraftaki boşluklarla nasıl başa çıkılacağını açıklamıyor.
ckujau

belirtildiği gibi bu çalışmıyor.
Lizardx

128

Deneyin

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

Kimden man rsync:

-s, - korumalı-args

Bu seçenek tüm dosya adlarını ve çoğu seçeneği uzak kabuğun yorumlamasına izin vermeden uzak rsync'e gönderir. Bu, boşlukların adlara bölünmediği ve joker karakter olmayan özel karakterlerin çevrilmediği anlamına gelir (~, $,; &, vb. Gibi). Joker karakterler uzak ana bilgisayarda rsync ile genişletilir (bunu yapan kabuk yerine). [...]


13
Bu Mac için çalışmıyor.
Matt Alexander

8
Ana demeti kullanarak rsync'nin en son sürümünü yüklerseniz Mac'te çalışır.
Adriaan Tijssel,

4
Çalıştırıp "--protect" için man rsync( /s) kullanarak rsync sürümünüzde olup olmadığına bakın . Homebrew ile kurmak için: brew install homebrew/dupes/rsyncBulunamadı ise çalıştırın brew search rsync.
MikeiLL

12
Yeni sürüm yüklemek gereksizdir, sadece boşluk kaçmak VE konak / dosya adı alıntı - örneğinrsync -Pavuz 'you@host:~/file\ with\ spaces' ./
ocodo

Bu kabul edilen cevap olmalı.
Josh M.

38

Bu bash olarak çalışır: boşlukları ters eğik çizgi ile açın ve sonra tırnak işaretini kullanın:

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

Veya $ remote_path değişkeninde yolunuz varsa, ikame ile boşluklardan kaçılabilir:

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

1
Bu benim için çalıştı. Beni bir Mac sunucusunda çalışmaktan kurtardı.
George,

1
Bu doğru cevap işaretlenmelidir. Önemli olan, hem ters eğik çizgilere hem de tırnaklara ihtiyaç duymanızdır.
Sridhar Sarnobat

4
Çifte kaçan bir acıdır, -sseçenek rsync'in herhangi bir modern versiyonunda çalışır ve bu sorunu çözmek için tasarlanmıştır
Mark K Cowan

Not : Uzak bir sunucudan, yolu olan bir yerel yola giden bir alana sahip olan bir alanı kopyalıyorsanız , tırnakları yalnızca uzak yola eklemeniz gerekir .
lenooh

@Teekarna'dan gelen çözüm benim için çalıştı. "Rsync" man sayfasına göre, alternatif benim için de işe yarayan "--protect-args" veya "-s" - kullanmaktır.
Kishan Parekh

14

İki çift tırnak kullanın

Tüm ters eğik çizgi ile uğraşmayın, sadece çift ​​tırnak içinde tek tırnak kullanın :

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

Ayrıca, tek tırnakların içindeki çift tırnak işaretini de kullanabilirsiniz :

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

Daha fazla bilgi

Sunucu tarafında joker karakterler

*İstemciden ziyade sunucuda yorumlanmasını istiyorsanız *, bu iki çift tırnaktan sadece birinin içine girmelidir. Bu karşı-sezgisel buluyorum çünkü mantıksal olarak dış tırnak çifti müşteri yorumlamasını, iç tırnak çifti ise sunucu yorumlamasını terk eder.

Args'i Koru

Avantajı karşılaştırıldığında --protect-argsçözümü , aslında bir kısıtlama yok olmasıdır --protect-args, bu nedenle aşağıdakiler gibi özel karakterler kullanabilirsiniz ~veya$ . Böylece yazabilirsiniz:

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

veya

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

~İkinci örnekteki tilde ( ) çift ​​tırnak işaretleri dışında olması gerektiğini unutmayın .

Tüm kullanıcı adı @ host etrafındaki tırnak çiftlerinden birini koyabilirsiniz: file part (örn. ssh "me@myserver.com:'/home/me/test file'" .)


Aslında, ana bilgisayar bölümünü tırnak içinde bırakmama öneriniz daha anlayışlıdır, bu nedenle bunu yazıdaki ilk satır yapmak caziptir.
Sridhar Sarnobat

2
Bu çözüm mükemmel! Ssh üzerinde rsync ile teneke üzerinde çalıştı.
Ikon

Bunu düşündüğünüzde, 2 çift tırnak tamamen mantıklıdır: dış tırnak çifti, müşterinin ayrı ayrı ele alması (içeriği sunucuya iletilir) ve iç tırnak çifti sunucu içindir. bölünmezliği tanımak.
Sridhar Sarnobat 12:18

Bu cevabı eksik.
Derple

6

Bunun eski bir soru olduğunu anlıyorum ama mevcut bilgi birikimine ekleyeceğimi düşündüm.

rsyncAlan içeren birden fazla klasör ile kullandım ve bu çalışır. Aşağıdaki gibi 1-10 arasında numaralandırılmış klasörler var:

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

Kullanmak istediğiniz 2 örnek rsyncyerel ve uzak.

  1. Yerel - Tırnakların eksikliğine dikkat edin.

    rsync -avu /media/data/The\ Folder* .
    
  2. Uzak - Tırnakların varlığına dikkat edin

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

3

Genel olarak, argümanı alıntılayın ve argümandaki boşluk karakterlerinden kaçın. Verdiğiniz örnekte, deneyin:

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

1

Gönderen rsyncMan sayfalarından:

   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

Bir başkası açıklamak için daha iyi bir iş çıkarsa da, bu soruyu kendim cevaplayacağım.

Açıkçası, hedef makinedeki kurulum argümanların nasıl ayrıştırıldığını etkiler ve boşluklardan kaçmak için tırnak işareti veya eğik çizgi kullanımını zorlaştıran bir kurulum yapmalıyız ancak joker kartlar kullanabiliriz.

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

Bu benim için çalışıyor, çünkü birden fazla klasör olsaydı bu işe yaramazsa adıyla başlayan tek bir dizin var .

Sonuçta, uzak sunucuyu yol adını daha verimli bir şekilde ayrıştırmak için nasıl kuracağımı anlamam gerekiyor - Dizin adlarında hiç boşluk kullanmam ama bunu ayarlayan kişi yaptı ve en azından şimdilik sıkışıp kaldım


Teklifiniz yalnızca ilk (başarısız) denemeniz sırasında hedef dizini oluşturduğunuz için çalışır. Daha kolay bir yol için cevabımı görün (bu, başarısız bir ilk denemeye güvenmeme avantajına da sahiptir :).
dg99

Aslında dizin zaten vardı. Bunu dizin oluşturulan benim başarısız girişimi doğru değil / ~ / isim değil Space ile / ~ / adı sildim / ~ / isim ve dizin farklı seçenekler çalışıyor tuttu alanı ile / ~ / isim ben dosyaları eklemek için çalışıyordu zaten vardı it
PyNEwbie

Ne demek istediğini anlıyorum.
dg99

Ana bilgisayar / yolun yanı sıra boşluklardan kaçarsanız alıntı yapar
ocodo

0

Duruma bağlı olarak, hızlı bir seçenek uzak sistemde bir sembolik bağlantı oluşturmaktır:

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

Ardından, dizin içeriğini izlemesini söyleyen -Lbayrağını kullanın rsync:

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

Düşünceyi seviyorum, sembolik bağlamanın kötü adlandırma zorluğunu veya gereksiz yere karmaşık hiyerarşileri atlattığı zamanlar oluyor.
Sridhar Sarnobat

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

çift ​​kaçış da işe yarıyor


-1

Bu yolu dene:

find /path/ -exec rsync -A -X -av -r -s root@xxxx:/path/ {} \;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.