Cách rsync trên ssh khi tên thư mục có khoảng trắng


71

Tôi đang cố gắng rsync từ máy chủ này sang máy chủ khác. Các máy chủ có cùng cấu trúc thư mục nhưng tôi gặp khó khăn khi máy chủ điều khiển từ xa nhận ra đúng tên đường dẫn trên điều khiển từ xa khi có khoảng trắng trong đó.

Đây là những thông tin chi tiết

Thư mục địa phương là

mnt/xlses/split/v2/name with space

Thư mục từ xa là

mnt/xlses/split/v2/name with space

Tôi đã thử mọi cách tôi có thể tìm thấy lần thử mới nhất là

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

Khi điều đó chạy, điều đầu tiên nó báo cáo là nó đang tạo một thư mục mới

Tôi ngắt nó và thấy rằng có một thư mục mới

mnt/xlses/split/v2/name

tất cả các tập tin của tôi đều nằm trong thư mục đó

Tôi đã mong họ ở

mnt/xlses/split/v2/name with space

Câu trả lời:


8

Thử

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

Tôi đã gỡ dấu gạch chéo /từ đường dẫn thư mục nguồn. Điều này sẽ rsyncsao chép thư mục và tất cả nội dung của nó, điều đó có nghĩa là rsyncsẽ lo lắng về việc đặt tên chính xác trên máy chủ từ xa (mà nó sẽ) thay vì bạn.


9
Điều này không làm việc cho tôi, nhưng câu trả lời của johnLate đã làm.
Adriaan Tijsseling

Điều này không giải thích làm thế nào để đối phó với không gian ở phía xa.
ckujau

Điều này không hoạt động, như đã lưu ý.
Lizardx

128

Thử

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

Từ man rsync:

-s, --protect-args

Tùy chọn này gửi tất cả tên tệp và hầu hết các tùy chọn đến rsync từ xa mà không cho phép trình điều khiển từ xa giải thích chúng. Điều này có nghĩa là các khoảng trắng không được phân chia theo tên và bất kỳ ký tự đặc biệt không phải ký tự đại diện nào sẽ không được dịch (chẳng hạn như ~, $,;, &, v.v.). Ký tự đại diện được mở rộng trên máy chủ từ xa bằng rsync (thay vì shell làm điều đó). [...]


13
Điều này không làm việc cho Mac.
Matt Alexander

8
Hoạt động trên máy Mac nếu bạn cài đặt phiên bản rsync gần đây bằng cách sử dụng tại nhà.
Adriaan Tijsseling

4
Xem nếu đó là phiên bản rsync của bạn bằng cách chạy man rsyncvà tìm kiếm ( /s) cho "--protect". Để cài đặt với homebrew: brew install homebrew/dupes/rsyncNếu không tìm thấy chạy brew search rsync.
MikeiLL

12
Phiên bản mới cài đặt là không cần thiết, bạn chỉ cần thoát khỏi không gian trích dẫn các máy chủ / filename - ví dụrsync -Pavuz 'you@host:~/file\ with\ spaces' ./
ocodo

Đây phải là câu trả lời được chấp nhận.
Josh M.

39

Điều này hoạt động trong bash: Thoát khỏi khoảng trắng bằng dấu gạch chéo ngược và sau đó sử dụng dấu ngoặc kép:

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

Hoặc nếu bạn có đường dẫn trong biến $ remote_path, khoảng trắng có thể được thoát bằng thay thế:

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

1
Điều đó làm việc cho tôi. Cứu tôi khỏi phải làm việc trên máy chủ Mac.
George

1
Điều này cần được đánh dấu câu trả lời đúng. Điều quan trọng là bạn cần cả dấu gạch chéo ngược và dấu ngoặc kép.
Sridhar Sarnobat

4
Thoát hiểm kép là một nỗi đau, -stùy chọn này hoạt động trên bất kỳ phiên bản hiện đại nào của rsync và được thiết kế để giải quyết vấn đề này
Mark K Cowan

Lưu ý : nếu bạn đang sao chép từ một máy chủ từ xa có khoảng trắng trong đường dẫn đến đường dẫn cục bộ có khoảng trắng, bạn chỉ cần thêm dấu ngoặc kép vào đường dẫn từ xa .
lenooh

Giải pháp từ @teekarna làm việc cho tôi. Theo trang man "rsync", thay thế là sử dụng "--protect-args" hoặc "-s" - điều đó quá hiệu quả đối với tôi.
Kishan Parekh

14

Sử dụng hai cặp dấu ngoặc kép

Đừng bận tâm với tất cả các dấu gạch chéo ngược, chỉ sử dụng dấu ngoặc đơn bên trong dấu ngoặc kép :

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

Bạn cũng có thể sử dụng ngược lại, nghĩa là, dấu ngoặc kép trong dấu ngoặc đơn :

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

Thêm thông tin

Ký tự đại diện ở phía máy chủ

Nếu bạn muốn *giải thích trên máy chủ chứ không phải máy khách, thì *phải vào bên trong chỉ một trong 2 cặp dấu ngoặc kép. Tôi thấy điều này phản trực giác bởi vì về mặt logic, cặp trích dẫn bên ngoài thoát khỏi sự giải thích của khách hàng, trong khi cặp trích dẫn bên trong thoát khỏi sự giải thích của máy chủ.

Bảo vệ đối số

Ưu điểm, so với --protect-argsgiải pháp , là bạn thực sự không có những hạn chế của --protect-args, vì vậy bạn có thể sử dụng các ký tự đặc biệt như ~hoặc$ . Vì vậy, bạn có thể viết:

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

hoặc là

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

Lưu ý rằng dấu ngã ( ~) trong ví dụ sau cần nằm ngoài dấu ngoặc kép.

Bạn có thể đặt một trong các cặp trích dẫn xung quanh toàn bộ tên người dùng @ host: phần tệp (ví dụ ssh "me@myserver.com:'/home/me/test file'" .)


Trên thực tế, đề xuất của bạn về việc không đặt phần chủ trong trích dẫn là sâu sắc hơn vì vậy thật hấp dẫn để làm cho đây là dòng đầu tiên trong bài.
Sridhar Sarnobat

2
Giải pháp này thật tuyệt vời! Làm việc như trên hộp thiếc với rsync trên ssh.
Ikon

Khi bạn nghĩ về nó, 2 cặp dấu ngoặc kép hoàn toàn hợp lý: cặp dấu ngoặc kép bên ngoài là để máy khách xử lý nó một cách không thể tách rời (nội dung được chuyển đến nguyên văn của máy chủ) và cặp dấu ngoặc kép bên trong là dành cho máy chủ để nhận ra sự không thể phân biệt
Sridhar Sarnobat

Câu trả lời này được đánh giá thấp.
Derple

6

Tôi hiểu đây là một câu hỏi cũ, nhưng tôi nghĩ rằng tôi sẽ bổ sung vào nhóm kiến ​​thức hiện có.

Tôi đã sử dụng rsyncvới nhiều thư mục có không gian và điều này hoạt động. Tôi có các thư mục được đánh số từ 1-10 như sau:

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

2 trường hợp bạn muốn sử dụng rsynclà cục bộ và từ xa.

  1. Địa phương - Lưu ý thiếu dấu ngoặc kép.

    rsync -avu /media/data/The\ Folder* .
    
  2. Từ xa - Lưu ý sự hiện diện của dấu ngoặc kép

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

3

Nói chung, trích dẫn đối số và thoát khỏi các ký tự khoảng trắng trong đối số. Trong ví dụ bạn đã đưa ra, hãy thử:

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

1

Từ các rsynctrang:

   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

Vâng, tôi sẽ tự trả lời câu hỏi này mặc dù người khác có thể làm tốt hơn việc giải thích nó.

Rõ ràng việc thiết lập trên máy đích ảnh hưởng đến cách phân tích đối số và chúng ta phải có một thiết lập nào đó gây khó khăn khi sử dụng dấu ngoặc kép hoặc dấu gạch chéo để thoát khoảng trắng nhưng chúng ta có thể sử dụng thẻ hoang dã nên tôi đã làm điều này

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

Điều này làm việc cho tôi vì chỉ có một thư mục bắt đầu bằng tên nếu tôi có nhiều thư mục này sẽ không hoạt động.

Cuối cùng, tôi cần hiểu cách thiết lập máy chủ từ xa để có thể phân tích tên đường dẫn hiệu quả hơn - Tôi không bao giờ sử dụng khoảng trắng trong tên thư mục nhưng người thiết lập điều này đã làm và ít nhất là bây giờ tôi bị kẹt


Đề xuất của bạn chỉ hoạt động vì bạn đã tạo thư mục đích trong lần thử đầu tiên (không thành công). Xem câu trả lời của tôi cho một cách dễ dàng hơn (điều đó cũng có lợi thế là không dựa vào lần thử đầu tiên thất bại :).
dg99

Vâng thực sự các thư mục đã tồn tại. Bạn không đúng trong lần thử thất bại của tôi, nó đã tạo thư mục / ~ / name not / ~ / name với Space I đã xóa / ~ / name và tiếp tục thử các tùy chọn khác nhau Thư mục / ~ / name tồn tại tôi đã cố gắng thêm tệp với nó
PyNEwbie

Ồ, tôi hiểu ý của bạn.
dg99

Hoạt động nếu bạn trích dẫn máy chủ / đường dẫn cũng như thoát khỏi khoảng trắng.
ocodo

0

Tùy thuộc vào tình huống, một tùy chọn nhanh là tạo liên kết tượng trưng trên hệ thống từ xa:

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

Sau đó sử dụng -Lcờ trong rsyncđó bảo nó theo nội dung thư mục:

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

Tôi thích suy nghĩ, có những lúc symlinking bỏ qua những rắc rối của việc đặt tên xấu hoặc phân cấp phức tạp không cần thiết.
Sridhar Sarnobat

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

thoát kép cũng làm việc


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.