ฉันจะหลีกเลี่ยงช่องว่างในเส้นทางสำหรับการคัดลอก scp ใน Linux ได้อย่างไร


307

ฉันใหม่กับ linux ฉันต้องการคัดลอกไฟล์จากระยะไกลไปยังระบบโลคอล ... ตอนนี้ฉันกำลังใช้คำสั่ง scp ในระบบ linux .. ฉันมีโฟลเดอร์หรือชื่อไฟล์บางไฟล์ที่มีช่องว่างเมื่อฉันพยายามคัดลอก ไฟล์จะแสดงข้อความแสดงข้อผิดพลาด: "ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว"

ฉันเหนื่อย:

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

ฉันเห็นการอ้างอิงออนไลน์ แต่ฉันไม่เข้าใจอย่างสมบูรณ์ใครช่วยได้บ้าง

ฉันจะหลีกเลี่ยงช่องว่างในชื่อไฟล์หรือชื่อไดเรกทอรีระหว่างการคัดลอก ...


ไม่ทำงาน !! ทำไปแล้ว ..
AlexPandiyan

ตรวจสอบอีกครั้งว่าไฟล์มีอยู่จริง ใส่เครื่องหมายคำพูดรอบเส้นทางทั้งหมดรวมถึงชื่อล็อกอินและที่อยู่ IP อีกทางหนึ่งคือรีโมทคำพูดและเพิ่มพื้นที่ว่างด้วยแบ็กสแลชแทน

คำตอบ:


491

โดยทั่วไปคุณต้องหลบหนีสองครั้งเพราะมันหลบหนีในพื้นที่แล้วในระยะไกล

มีสองตัวเลือกที่คุณสามารถทำได้ (ในทุบตี):

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
นี่เป็นเรื่องที่ค่อนข้างเล็ก แต่สำหรับ Mac และในแอปคอนโซลส่วนใหญ่เช่นเทอร์มินัลจะมีตัวเลือก 'วางข้อความหนี' ฉันจึงใช้ตัวเลือกที่สอง
Sacrilicious

3
'"path"' ทำงานในขณะที่ "'path'" ล้มเหลว สรุปคำพูดเดี่ยวก่อนแล้วจึงอัญประกาศคู่ล้อมรอบ

7
ว้าว! นั่นอาจเป็นพฤติกรรมของโปรแกรมที่ไร้สาระที่สุดที่ฉันเคยเห็น!
jankes

2
@jankes มันไม่ได้มีข้อดี ข้อเท็จจริงที่ว่าสิ่งที่คุณใส่มีอาร์กิวเมนต์คำสั่งเชลล์ช่วยให้คุณสามารถทำสิ่งที่ต้องการscp user@example.com:'$(ls -t | head -1)' .ได้รับไฟล์ที่สร้างขึ้นล่าสุดในเซิร์ฟเวอร์หรือscp user@example.com:'dir/*.{xml,pdf}' .เพื่อรับไฟล์ xml และ pdf ทั้งหมดจากไดเรกทอรีระยะไกล โดยทั่วไปแล้วฉันชอบสิ่งนี้มากกว่าที่จะสะดวกกับไฟล์ที่มีช่องว่าง ไฟล์ที่มีช่องว่างมักเป็นสิ่งที่น่ารำคาญ
JoL

1
ทำไมมันถึงหนีออกมา 2 ครั้ง มีวิธีใดบ้างที่จะเปลี่ยนพฤติกรรมนี้
Fractale

76

โรงงาน

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

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

ไม่ทำงาน, ไม่เป็นผล

scp localhost:'f/a b c' .

เหตุผลคือสตริงถูกตีความโดยเชลล์ก่อนที่เส้นทางจะถูกส่งผ่านไปยังคำสั่ง scp ดังนั้นเมื่อมันถึงรีโมตรีโมตกำลังมองหาสตริงที่มีเครื่องหมายคำพูดที่ไม่ใช้ค่า Escape และมันล้มเหลว

หากต้องการดูสิ่งนี้ในทางปฏิบัติให้เริ่มต้นเชลล์ด้วยตัวเลือก -vx เช่นbash -vxนั้นและจะแสดงเวอร์ชันที่ถูกสอดแทรกของคำสั่งเมื่อมันรัน


การใช้เครื่องหมายคำพูดเดี่ยวและการหลบหนีใช้งานได้สำหรับฉัน แต่ไม่ใช่การเสนอราคาสองเท่า
Mauricio Trajano

1
@MauricioTrajano ลองดูที่gnu.org/software/bash/manual/html_node/Quoting.htmlเครื่องหมายคำพูดทั้งหมดทำสิ่งที่แตกต่างกัน ในกรณีง่าย ๆ ข้างต้นงานสองชิ้น"หรือ'งานเดียวก็เหมือนกัน
Vorsprung

34

นอกจากนี้คุณสามารถทำสิ่งที่ชอบ:

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

scp ระดับแรกจะถูกตีความโดย scp และระดับที่สองของราคาจะรักษาช่องว่าง


4
คำตอบนี้ได้รับการจัดอันดับต่ำกว่าเนื่องจากพิจารณาว่ามีช่องว่างจำนวนเท่าใดที่สามารถจัดการกับจำนวนอักขระเลี่ยงได้เท่ากัน ขอบคุณ!
Michael

20

ใช้ 3 แบ็กสแลชเพื่อหนีช่องว่างในชื่อไดเรกทอรี:

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

ควรคัดลอกที่คุณDownloadsไดเรกทอรีจากไดเรกทอรีระยะไกลที่เรียกว่าfiledirectory with spaces


นี่เป็นสิ่งเดียวที่ใช้ได้กับฉันใน Ubuntu 19.10 ไม่มีเครื่องหมายคำพูดคู่ไม่มีเครื่องหมายคำพูดแบบนุ่มและยากและไม่มีคำพูดที่หลบหนี tripplebackslashed ช่องว่างเท่านั้น แปลกมาก. ขอบคุณ!
uldics

9

ฉันมีปัญหาอย่างมากในการทำให้เชลล์ทำงานด้วยชื่อไฟล์ที่มีช่องว่าง ด้วยเหตุผลบางอย่างใช้

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

ในคำตอบของ @ Adrian ดูเหมือนจะล้มเหลว

ปรากฎว่าสิ่งที่ดีที่สุดคือการใช้การขยายพารามิเตอร์เพื่อผนวกแบ็กสแลชที่เหลือไว้ในช่องว่างดังนี้

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

ฉันอยากจะแนะนำการขยายตัวที่แข็งแกร่งมากขึ้น 'แทนทั้งหมด': file="${file//\ /\\\ }"
รอยเตอร์

ลืมความแตกต่างนั้นออกไป - ฉันเป็นสนิมกับการขยายพารามิเตอร์ ขอบคุณ!
ลุคเดวิส

ฉันไม่ได้มีตัวแปร แต่สิ่งนี้ทำให้ฉันพึงพอใจในฐานะทางเลือกที่ดีสำหรับแบ็กสแลช 3 รายการสำหรับเส้นทางที่มีช่องว่างมากมาย ไม่มีใครมีเวลาทำแบบนั้น!
Robert Dundon

1

ขออภัยที่ใช้คำถาม Linux นี้เพื่อนำเคล็ดลับนี้สำหรับ Powershell บน Windows 10: การเว้นวรรคหลบหนีด้วยแบ็กสแลชหรือเครื่องหมายคำพูดล้อมรอบด้วยเครื่องหมายคำพูดไม่ทำงานสำหรับฉันในกรณีนี้ ไม่มีประสิทธิภาพ แต่ฉันแก้ไขโดยใช้ "?" ถ่านแทน:

สำหรับไฟล์ "task.txt Jun-22.bkp" ฉันดาวน์โหลดโดยใช้ "task.txt? Jun-22.bkp"

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.