วิธีแสดงรายการ / dev / ดิสก์ทั้งหมดไม่ใช่พาร์ติชันที่ลงท้ายด้วย s1, s2, …?


0

ฉันพยายามที่จะแสดงรายการ (เอาท์พุท) ไดรฟ์ชื่อ Mac OS X จากหมายเลขซีเรียลในเชลล์ Bash 3.2 บนบรรทัดคำสั่ง สำหรับเรื่องนี้ฉันต้องวนลูปผ่านอุปกรณ์บล็อกทั้งหมดที่ไม่ได้เป็นพาร์ติชัน ดังนั้นฉันต้องการการแทนที่ที่ดีกว่าสำหรับ bash loop นี้: for disk in /dev/disk*; do …; done

ฉันต้องการใช้ ls เท่านั้น ในที่สุดก็มีรูปแบบไวด์การ์ดโดยไม่มีการไพพ์ (ผ่าน grep ) และไม่มีสิ่งของอื่น ๆ (เช่น find )

มันเป็นเหมือน ls /dev/disk* แต่ไม่ตรงกับพาร์ติชันที่ลงท้ายด้วย s1 (ชอบ /dev/disk0s1 ) s2 เป็นต้น

การถอยหลัง

ความพยายามที่ล้มเหลว:

$ ls /dev/disk[0-9]*[!s][!1-9]
$ ls /dev/disk[0-9]*[!s,!1-9]
$ ls /dev/disk* -d -- *[!s][1-9]
$ ls /dev/disk[0-9]*[!s,1-9]
$ ls /dev/disk[0-9]*[!s]
$ ls /dev/disk[0-9]*[!s][0-9]
$ ls /dev/disk[0-9]*[!s]*
$ ls /dev/disk[0-9]*[!\s1-9]
$ ls /dev/disk[0-9]*[!s1-9]
$ ls /dev/disk[0-9]*([!s1-9])
$ ls /dev/disk[0-9]*[!s]*[0-9]
$ ls /dev/disk[0-9][0-9]
$ ls /dev/disk* --ignore="disk*s?"
$ ls /dev/disk* -I "*s?"
$ ls /dev/disk* -I "*s[1-9]"
$ ls /dev/disk*[!s?]

คำตอบ:


1

การใช้ ksh glob ยาวของ:

ls /dev/+(disk?|disk??)

สำหรับ bash คุณต้องเปิด glob แบบขยาย

shopt -s extglob
ls /dev/+(disk?|disk??)

โปรดอย่าภายนอกไม่แม้แต่จะเปิดแฉกขยายออกไป -bash: syntax error near unexpected token '('
Pro Backup

@Pro Backup- แล้วคุณจะได้รับข้อผิดพลาดนั้นถ้าคุณไม่ได้ตั้งค่า glob แบบขยาย โปรดอธิบายว่าทำไมคุณต้องการ จำกัด คุณสมบัติของเชลล์
fd0

ฉันไม่กล้าเปลี่ยนตัวเลือกของเชลล์ซึ่งอาจทำให้การประมวลผลของสคริปต์ทุบตี / เชลล์อื่น ๆ เสียหาย
Pro Backup

@Pro Backup- เอาล่ะการตั้งค่า extended glob จะไม่ "ทำลาย" สคริปต์ทุบตีของคุณเช่นเดียวกับการตั้งค่า null glob ในคำตอบของคุณไม่ได้ "ทำลาย" อะไร โชคดี.
fd0

0
$ ls /dev/disk[0-9]{,[0-9]}
/dev/disk0  /dev/disk11 /dev/disk2  /dev/disk4  /dev/disk6  /dev/disk8
/dev/disk10 /dev/disk12 /dev/disk3  /dev/disk5  /dev/disk7  /dev/disk9
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.