วิธี scp ด้วยนิพจน์ทั่วไป


13

ฉันพยายามคัดลอกไฟล์ทั้งหมดที่ไม่ได้ขึ้นต้นด้วยตัวอักษร "a" ในหน่วย ksh

การคัดลอกจากเครื่องต้นทางไปยังเครื่องปลายทางทำงานได้ดี :

scp -p !(a*) user@machine:/path/directory/.

แต่ถ้าฉันอยู่บนเซิร์ฟเวอร์ปลายทางและต้องการคัดลอกจากเซิร์ฟเวอร์ต้นทางล้มเหลว:

scp -p user@machine:/path/!(a*) .

ความคิดใด ๆ

คำตอบ:


17

ฉันเห็นด้วยกับ vonbrand Globing ถูกจัดการโดยเชลล์ที่คุณใช้งานดังนั้นscp user@machine:/path/*จะขยาย / path / * ไปยังไฟล์ใน LOCAL / path / * ไม่ใช่บนเครื่องรีโมต

อย่างไรก็ตามสำหรับยิ้มฉันพยายาม:

scp "user@machine:/path/[regex here]" .  

และ .... มันใช้งานได้ ลองดู หมายเหตุคำพูด จำเป็นมาก แจ้งให้เราทราบ.

หมายเหตุ: บัญชีผู้ใช้บนเครื่องระยะไกลอาจเริ่มต้นเป็นโปรแกรมเชลล์ที่แตกต่างจากของคุณดังนั้นกฎของการขยายตัวบัตรอาจแตกต่างกันดังนั้นเครื่องที่


1

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

ขออภัยทำไม่ได้ (ง่าย)


คำตอบนี้ผิด โปรดลบ :)
Michael

1

สิ่งที่ฉันพบคือบนเครื่อง HP-UX รุ่นเก่า (parisc 11.11) ฉันต้องใช้ [^ a] * แต่สำหรับเครื่องรุ่นใหม่ (parisc 11.31 และใหม่กว่า) มันใช้ได้กับ! (a *)

นี่คือสิ่งที่ฉันลงเอยด้วย และมันใช้งานได้:

    if [[  ${S_MACH} = "phd026a" || ${S_MACH} = "tht030a" ]]
    then
            scp -p -r ${S_MACH}:${S_DIR}/bin/[^a^b^c^p]* ${D_DIR}/bin/.
    else
            scp -p -r ${S_MACH}:${S_DIR}/bin/!((a*)|(b*)|(c*)|(p*)) ${D_DIR}/bin/.
    fi

โซลูชันทั้งสองทำงานให้ฉันบนเซิร์ฟเวอร์ 11.11
DarkHeart

0

ชื่อระยะไกลที่ส่งไปยังscpถูกตีความว่าเป็นรายการรูปแบบที่คั่นด้วยช่องว่างในด้านระยะไกล นี้มักจะเป็นความน่ารำคาญเมื่อคุณพยายามที่จะคัดลอกไฟล์ที่มีชื่อมีช่องว่าง แต่ที่นี่มันมีประโยชน์: จะคัดลอกไฟล์ทั้งหมดที่มีชื่อขึ้นต้นด้วยscp -p 'user@machine:/path/a*' .a

คำสั่งของคุณจะทำงานหากคุณพูดถึงรูปแบบเพื่อให้ตีความได้จากระยะไกลมากกว่าในพื้นที่หากคุณผ่านอุปสรรค์อื่น รูปแบบ!(a*)ไม่ใช่รูปแบบเชลล์พื้นฐานเป็นส่วนขยาย ksh (bash และ zsh นั้นรองรับหากคุณตั้งค่าตัวเลือกที่เหมาะสม) ดังนั้นสิ่งนี้จะใช้ได้ก็ต่อเมื่อรีโมตเชลล์ของคุณเป็น ksh ไม่ใช่ว่าเป็นเชลล์อื่นและคุณexec kshจาก.profileหรือคล้ายกัน

วิธีที่ง่ายเว้นแต่คุณอยู่ในชนิดของสภาพแวดล้อมที่ถูก จำกัด scpหรือโบราณบางส่วนเป็นจะลืมเกี่ยวกับ คุณต้องการไฟล์ระยะไกลในการทำงานเช่นเดียวกับไฟล์ในท้องถิ่นเพื่อให้พวกเขาไฟล์ท้องถิ่น: ติดไดเรกทอรีระยะไกลด้วยsshfs สิ่งนี้ต้องการ FUSE บนเครื่องโลคัลและเซิร์ฟเวอร์ SFTP (เช่นsftp-serverไฟล์เรียกทำงานที่sshdเรียกทำงาน) บนเครื่องรีโมต

mkdir ~/net/machine
sshfs user@machine:/ ~/net/machine
cp -p ~/net/machine/path/!(a*) .
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.