ยกเว้นหนึ่งไดเรกทอรีในรูปแบบการจับคู่ `ls '


13

ฉันพยายามที่จะlsdirs ที่มี.pngไฟล์อยู่ภายใน (ไม่จำเป็นต้องเรียกซ้ำแม้ว่ามันจะมีประโยชน์พิเศษ) ยกเว้นหนึ่ง ยกเว้นหนึ่งไดเรกทอรีเช่น

ls */*.png

ทำงานได้ดี

ls (^one)*/*.png

ไม่ส่งคืน stdout ฉันจะประสบความสำเร็จได้อย่างไร

ฉันตาบอดแล้วก็ส่งไปที่espeakดังนั้นฉันสามารถได้ยินได้แค่ตอนนี้เท่านั้น


คุณใช้เปลือกไหน รูปแบบของคุณดูเหมือนรูปแบบ zsh แม้ว่าจะไม่มีประโยชน์เนื่องจากจะไม่แยกone(รูปแบบที่เหมาะสม^one/*.png) แต่ก็จะพิมพ์ทุกอย่าง
Gilles 'หยุดความชั่วร้าย'

คำตอบ:


16

ตัวเลือกที่ 1 - การใช้เพียงแค่ls:
เมื่อเปิด bash globbing ที่เปิด ( shopt -s extglob) คุณสามารถทำได้:

ls !(one*)/*.png


ตัวเลือก 2 - การรวมlsและgrep:

คุณสามารถรวมlsกับgrep -v

  • เช่น ls */*.png | grep -v "one/"


ตัวเลือก 3 - (IMO ที่ดีที่สุด) แต่findไม่ใช้ls:

สำหรับการค้นหาแบบเรียกซ้ำของไดเรกทอรีย่อยทั้งหมดโดยใช้ find

find . -type f -name "*.png" -not -path "*/one/*"


ทั้งหมดข้างต้นหนึ่งสมุทรจะแสดงรายการไดเรกทอรีที่มี.pngไฟล์ในขณะที่การกรองการจับคู่เส้นทางใด ๆone/; ตัวเลือกที่ 3 เท่านั้นที่จะทำสิ่งนี้ซ้ำ


findคำสั่งไม่จำเป็นต้องพูด-path "*/one/*"หรือ-path "./one/*"?
G-Man กล่าวว่า 'Reinstate Monica'

@ G-Man คุณพูดถูก แก้ไขข้างต้น
toxefa

จะไม่ตรงกับที่./phone/handset.png?
G-Man กล่าวว่า 'Reinstate Monica'

@ G-Man มีอะไรผิดปกติกับการจับคู่.pngs ในไดเรกทอรีที่เรียกว่าphone? ผมคิดว่าเราเป็นเพียงแค่พยายามที่จะไม่รวมone?
toxefa

1
ดีตั้งแต่คุณใช้ในการเชื่อมต่อกับ-notมันหมายความว่ามันเป็นสาเหตุที่ทำให้ไฟล์ที่จะไม่รวมอยู่ในไดเรกทอรีที่เรียกว่าfind phone
G-Man กล่าวว่า 'Reinstate Monica'

6

ในzshใส่ในของคุณsetopt extended_glob ~/.zshrcจากนั้นคุณสามารถใช้รูปแบบสัญลักษณ์แทน การยกเว้นไดเรกทอรีที่เรียกว่า^oneone

ls ^one/*.png

หากคุณต้องการเรียกเก็บเงินคืนในไดเรกทอรีย่อยให้ใช้**/สำหรับการวนซ้ำแบบซ้ำ หากต้องการยกเว้นไดเรกทอรีที่เรียกว่าoneที่ระดับบนสุดเช่นเดียวกับไดเรกทอรีระดับบนสุด:

ls ^one/**/*.png

ในการแยกไฟล์ในไดเรกทอรีย่อยที่เรียกว่าoneแต่ไม่ใช่ไฟล์ในไดเรกทอรีย่อย:

ls **/^one/*.png

ในการแยกไฟล์ภายใต้ไดเรกทอรีย่อยที่เรียกว่าoneระดับใดก็ตามให้ใช้รูปแบบซ้ำกับ#โอเปอเรเตอร์รอบการปฏิเสธ:

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