Làm cách nào để thoát khoảng trắng trong đường dẫn cho bản sao scp trong Linux?


307

Tôi mới sử dụng linux, tôi muốn sao chép một tập tin từ xa sang hệ thống cục bộ ... bây giờ tôi đang sử dụng lệnh scp trong hệ thống linux .. Tôi có một số thư mục hoặc tên tệp có dấu cách, khi tôi cố gắng sao chép tập tin, nó hiển thị thông báo lỗi: "Không có tập tin hoặc thư mục như vậy"

Tôi đã thử:

scp ael5105@192.168.0.200:'/home/5105/test/gg/Untitled Folder/a/qy.jpg' /var/www/try/

Tôi thấy một số tài liệu tham khảo trực tuyến nhưng tôi không hiểu một cách hoàn hảo, có ai có thể giúp đỡ về điều này không?

Làm cách nào tôi có thể thoát khoảng trắng trong tên tệp hoặc tên thư mục trong khi sao chép ...


Không không hoạt động !! đã làm điều đó ..
AlexPandiyan

Kiểm tra kỹ xem tập tin có thực sự tồn tại không Đặt dấu ngoặc kép trên toàn bộ đường dẫn, bao gồm tên đăng nhập và địa chỉ IP. Ngoài ra, thay vào đó, trích dẫn các dấu ngoặc kép và thêm dấu cách vào dấu gạch chéo ngược.

Câu trả lời:


491

Về cơ bản, bạn cần phải thoát nó hai lần, bởi vì nó thoát ra cục bộ và sau đó ở đầu xa.

Có một số tùy chọn bạn có thể làm (trong bash):

scp user@example.com:"'web/tmp/Master File 18 10 13.xls'" .
scp user@example.com:"web/tmp/Master\ File\ 18\ 10\ 13.xls" .
scp user@example.com:web/tmp/Master\\\ File\\\ 18\\\ 10\\\ 13.xls .

11
Điều này khá nhỏ, nhưng trên máy Mac và trong hầu hết các ứng dụng bảng điều khiển như Terminal, đều có tùy chọn 'Dán văn bản thoát'. Do đó tôi đã sử dụng tùy chọn thứ hai.
Sắc sảo

3
'"đường dẫn"' hoạt động trong khi "'đường dẫn" "không thành công; kết luận dấu ngoặc đơn trước và sau đó là dấu ngoặc kép để bao quanh

7
Ồ Đó có lẽ là hành vi chương trình kỳ cục nhất mà tôi từng thấy!
jankes

2
@jankes Không phải là không có công. Thực tế là những gì bạn đặt ở đó là một đối số lệnh shell cho phép bạn thực hiện những thứ như scp user@example.com:'$(ls -t | head -1)' .để lấy tệp được tạo gần đây nhất trong máy chủ hoặc scp user@example.com:'dir/*.{xml,pdf}' .để lấy tất cả các tệp xml và pdf từ một thư mục từ xa. Nói chung, tôi thích điều này hơn là thuận tiện với các tệp có không gian. Các tập tin với không gian luôn luôn là một bận tâm.
JoL

1
Tại sao nó lại trốn thoát 2 lần? cách nào để thay đổi hành vi này?
Fractale

76

làm

scp localhost:"f/a\ b\ c" .

scp localhost:'f/a\ b\ c' .

không hoạt động

scp localhost:'f/a b c' .

Lý do là chuỗi được giải thích bởi shell trước khi đường dẫn được chuyển đến lệnh scp. Vì vậy, khi nó đến điều khiển từ xa, điều khiển từ xa đang tìm kiếm một chuỗi với các trích dẫn không được giải thích và nó thất bại

Để thấy điều này trong thực tế, hãy khởi động một shell với các tùy chọn -vx tức là bash -vxnó sẽ hiển thị phiên bản nội suy của lệnh khi nó chạy nó.


Sử dụng dấu ngoặc đơn và thoát có hiệu quả đối với tôi nhưng không phải là dấu ngoặc kép
Mauricio Trajano

1
@MauricioTrajano hãy xem gnu.org/software/bash/manual/html_node/Quote.html tất cả các trích dẫn làm những việc khác nhau. Trong trường hợp đơn giản ở trên, đôi "hoặc đơn đều 'hoạt động như nhau
Vorsprung

34

Ngoài ra, bạn có thể làm một cái gì đó như:

scp foo@bar:"\"apath/with spaces in it/\""

Cấp độ trích dẫn đầu tiên sẽ được giải thích bằng scp và sau đó cấp độ trích dẫn thứ hai sẽ giữ nguyên khoảng trắng.


4
Câu trả lời này được đánh giá thấp, xem xét có bao nhiêu khoảng trống có thể xử lý với cùng số lượng ký tự thoát. Cảm ơn!
Michael

20

Sử dụng 3 dấu gạch chéo ngược để thoát khoảng trắng trong tên của các thư mục:

scp user@host:/path/to/directory\\\ with\\\ spaces/file ~/Downloads

nên sao chép vào Downloadsthư mục của bạn từ thư mục filetừ xa được gọi directory with spaces.


Đây là người duy nhất làm việc cho tôi trên Ubuntu 19.10. Không có dấu ngoặc kép, không có dấu ngoặc kép mềm và cứng, không có dấu ngoặc kép thoát. Chỉ có không gian gấp ba lần. Rất kì lạ. Cảm ơn bạn!
uldics

9

Tôi đã gặp khó khăn rất lớn để làm việc này cho một biến shell chứa tên tệp có khoảng trắng. Đối với một số lý do sử dụng

file="foo bar/baz"
scp user@example.com:"'$file'"

như trong câu trả lời của @ Adrian dường như thất bại.

Hóa ra những gì hoạt động tốt nhất là sử dụng mở rộng tham số để thêm dấu gạch chéo ngược vào khoảng trắng , như sau.

file="foo bar/baz"
file="${file//\ /\\\ }"
scp user@example.com:"$file"

Tôi sẽ đề nghị mở rộng 'thay thế tất cả' mạnh mẽ hơn: file="${file//\ /\\\ }"
troyreasger 18/12/17

Quên về sự khác biệt đó - Tôi không tin vào những mở rộng tham số của mình. Cảm ơn!
Luke Davis

Tôi đã không có một biến nhưng điều này làm tôi hài lòng vì là một thay thế tốt cho 3 dấu gạch chéo ngược cho một đường dẫn có nhiều khoảng trắng. Không ai có thời gian cho điều đó!
Robert Dundon

1

Xin lỗi vì đã sử dụng câu hỏi Linux này để đưa mẹo này cho Powershell trên Windows 10: char không gian thoát với dấu gạch chéo ngược hoặc xung quanh có dấu ngoặc kép không hoạt động với tôi trong trường hợp này. Không hiệu quả, nhưng tôi đã giải quyết nó bằng cách sử dụng dấu "?" thay vào đó

cho tệp "task.txt Jun-22.bkp" Tôi đã tải xuống bằng "task.txt? Jun-22.bkp"

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.