คำถามถามถึงนิพจน์ทั่วไป 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 extglob
endabled: