คำถามถามถึงนิพจน์ทั่วไป Bash และlsไม่รองรับนิพจน์ทั่วไปที่นี่ สิ่งที่รองรับคือนิพจน์ชื่อไฟล์ ( Globbing ) รูปแบบของอักขระตัวแทน การแสดงออกปกติมีพลังมากกว่านั้นมาก
หากคุณต้องการใช้นิพจน์ทั่วไปคุณสามารถใช้find -regexสิ่งนี้:
find . -maxdepth 1 -regex '\./.*[^0-9][0-9]\.txt'
การค้นหาจะเรียกซ้ำโดยค่าเริ่มต้น แต่lsไม่ใช่ -maxdepth 1เพียงหาไฟล์ในไดเรกทอรีปัจจุบันคุณสามารถปิดการเรียกซ้ำกับ ค้นหารายการที่ตรงกับชื่อไฟล์ด้วยพา ธ นั่นคือสาเหตุที่ชื่อไฟล์ขึ้นต้นด้วย./ถ้าคุณพบ.ชื่อ regex เริ่มต้นด้วย\./การรับมือกับสิ่งนั้น โปรดทราบว่าใน regex .เป็นอักขระพิเศษที่ตรงกับตัวละครใด ๆ แต่ที่นี่เราต้องการจุดจริงๆนั่นคือเหตุผลที่เราหลบหนีด้วยแบ็กสแลช เราทำเช่นเดียวกันกับจุด.txtเพราะ regex จะจับคู่Atxtเช่นกัน คลาสหลักนั้นเหมือนกับ globbing เพียงแค่คุณต้องการ^แทนที่จะ!สลับคลาสของตัวละคร
หากคุณต้องการได้ผลลัพธ์จากlsนั้นคุณสามารถใช้-exec lsสิ่งนี้:
find . -maxdepth 1 -regex '\./.*[^0-9][0-9]\.txt' -exec ls -lah {} \;
findรองรับรสชาติต่าง ๆ ของ regex คุณสามารถระบุ-regextypeตัวอย่างเช่น:
find . -maxdepth 1 -regextype egrep -regex '\./.*[^0-9][0-9]\.txt'
สำหรับฉันประเภทที่เป็นไปได้คือ: 'findutils-default', 'awk', 'egrep', 'ed', 'emacs', 'gnu-awk', 'grep', 'posp-awk', 'posix-basic' , 'posix-egrep', 'posix-Extended', 'posix-minimal-basic', 'sed' คุณสามารถเรียกใช้find -regextype helpเพื่อค้นหาว่าระบบของคุณรองรับอะไรบ้าง
shopt -s extglobendabled: