แสดงรายการไฟล์ด้วยสัญลักษณ์แทน UNIX


14

พูดเช่นฉันมีไฟล์ต่อไปนี้ในไดเรกทอรีการทำงานของฉัน: mjk0001.fits, mjk0002.fits, ... ตัวเลขเพิ่มขึ้นเรื่อย ๆ จนถึง mjk9999.fits

มีวิธีใช้สัญลักษณ์ตัวแทน UNIX ในการแสดงรายการหรือดำเนินการกับกลุ่มตามลำดับหรือไม่? ตัวอย่างเช่นหากฉันต้องการเรียกใช้กระบวนการใน 0025 ถึง 0050 ฉันจะใช้รูปแบบใด

ฉันได้ลองสิ่งต่อไปนี้แล้ว แต่ไม่ประสบความสำเร็จ:

ls *[25-50].fits
ls mjk00[25-50].fits
ls mjk[0025-0050]*
ls *[0025-0050]*

ขอบคุณทุกคนล่วงหน้า MK


สำหรับการอ้างอิง: การจับคู่รูปแบบ , globbing
Ignis

คำตอบ:


20

คุณสามารถใช้การขยายรั้ง:

ls mjk00{25..50}.fits

สามารถรวมศูนย์นำหน้าได้หากจำเป็น:

ls mjk0{000..149}.fits

1
{25..50..2}โดยใช้รูปแบบนี้คุณยังสามารถระบุค่าขั้นตอน:
nobar

1

ไม่ได้โดยตรง แต่คุณสามารถใช้รูปแบบ glob หลายแบบ:

ls mjk002[56789].fits mjk00[34]?.fits

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


1

คุณสามารถใช้ regex กับ grep ฉันไม่ใช่กูรูเรก ต่อไปนี้จะคืนค่ารูปแบบด้วยตัวเลขระหว่าง 25-50:

ls | sort -n | grep -E 'mjk00([2][5-9]|[3-4][0-9]|[5][0]).fits'

ฉันไม่รู้ว่ามันเป็นไปได้หรือไม่


0

อาจเป็นไปได้ที่จะได้รับความสะดวกในการพกพาหรือความยืดหยุ่นที่มากขึ้นโดยใช้การforวนซ้ำและprintf:

for i in $(seq 25 50 1) ; do ls --escape $(printf "mjk%04d*" $i) ||true; done

นี้จะจัดการกับช่องว่างได้ดีและผลลัพธ์เหมาะสำหรับการไปป์ไลน์เพื่อxargsการประมวลผลเพิ่มเติม

ตัวเลขที่มีการจับคู่หลายรายการจะส่งผลให้มีการแสดงรายการไฟล์ที่ตรงกันทั้งหมด

ตัวเลขที่ไม่มีการแข่งขันจะรายงานข้อผิดพลาดใน stderr แต่จะ||trueระงับการส่งคืนข้อผิดพลาดระดับ bash


ในกรณีพื้นฐานแม้ว่าการใช้forและprintfไม่แตกต่างจากความรัดกุมมากขึ้น:

ls --escape mjk{0025..0050..1}* ||true

หากคุณต้องการแยกผลลัพธ์ของการขยายรั้งคุณสามารถใช้ a สำหรับลูป:for i in {025..050} ; do ... ; done
nobar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.