zsh: ไม่รวมไฟล์จากรูปแบบ


18

ว่าฉันมีไฟล์ต่อไปนี้:

|-- bar
`-- foo
    |-- type_A_1
    |-- type_A_2
    |-- type_B_1
    |-- type_B_2
    |-- type_B_xx
    |-- type_B_xx
    `-- something_else

ฉันคิดว่าคำสั่งดังต่อไปนี้

print -l foo/*~{type_B*}

จะพิมพ์ทุกอย่างภายใต้foo ยกเว้นสิ่งที่เริ่มต้นด้วยtype_Bแต่ไม่พิมพ์แทนทุกอย่างภายใต้ foo:

foo/type_A_1
foo/type_A_2
foo/type_B_1
foo/type_B_2
foo/type_B_xx
foo/something_else

ฉันพยายามprint -l foo/*~type_Bและได้สิ่งเดียวกัน

wildcard ข้อยกเว้น~ทำงานใน zsh อย่างไร

คำตอบ:


10

คุณต้องรวมไดเรกทอรีเข้าข้อยกเว้นนี้หรือprint -l foo/*~foo/type_A*print -l foo/*~{foo/type_A*}

หากคุณต้องการคุณสามารถแทนที่ไดเรกทอรีด้วยตัวแทน: print -l foo/*~*/type_A*


ขอบคุณ! เกี่ยวกับรูปแบบที่สองคุณคิดอธิบายวิธีการfoo/*~*/type_A*ทำงานของรูปแบบหรือไม่ โฟลเดอร์ที่สอง*ขยายไปยังทุก ๆโฟลเดอร์ภายใต้ไดเรกทอรีทำงานหรือไม่หรือมันฉลาดพอที่จะขยายเฉพาะfooหรือไม่
Amelio Vazquez-Reina

@roseck เนื่องจากดูเหมือนว่าจะเร็วมาก (ตัวอย่างเช่นเมื่อคุณเรียกใช้print *~**/*ใน/ไดเรกทอรี) ฉันคิดว่ามันจะขยายรูปแบบแรกก่อนจากนั้นจึงลบการจับคู่ทั้งหมดที่เหมาะสมกับรูปแบบการยกเว้น
jofel

2
@roseck ~เป็นข้อความล้วนส่วนก่อนที่~จะขยายตามที่มันมักจะแล้วส่วนหลังจากแถบออกไปตรง @jofel การทดสอบที่ดีกว่าน่าจะเป็นprint /**/*~*: คุณสามารถสังเกตได้ว่ามันเคลื่อนที่ผ่านต้นไม้ทั้งหมดแม้ว่ามันจะไม่ได้พิมพ์อะไรก็ตาม
Gilles 'หยุดความชั่วร้าย' Gilles

ฉันคิดว่าเขาต้องการยกเว้น type_B แต่รวม type_A
systemovich

คำตอบที่ถูกต้องอยู่ด้านล่าง
aryndin

30

zshมี^โอเปอเรเตอร์ glob เมื่อ EXTENDED_GLOB เปิดอยู่ ดูเหมือนว่าเหมาะสมกับสถานการณ์ของคุณมากที่สุด:

setopt extendedglob
print -rl foo/^type_A*

มันหมายถึง“ จับคู่อะไรก็ได้ยกเว้นสิ่งที่ตรงกับรูปแบบต่อไปนี้” แต่เอฟเฟกต์นั้น จำกัด อยู่ที่ส่วนของรูปแบบระหว่างเครื่องหมายทับหรือระหว่างจุดเริ่มต้นของรูปแบบและรูปแบบทับแรกหรือ (ในกรณีนี้) ระหว่างช่วงสุดท้าย เครื่องหมายทับและส่วนท้ายของรูปแบบ

คุณสามารถดูตัวเลือกzsh ที่เปิดใช้งานในปัจจุบันด้วย:

setopt

และปิดการใช้งาน EXTENDED_GLOB ด้วย:

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