รายการที่มี `ls 'และนิพจน์ทั่วไป


15

ฉันจะแสดงรายการไฟล์ที่มีชื่อไฟล์ซึ่งลงท้ายด้วยอักขระตัวสุดท้ายและ.txtนามสกุลได้อย่างไร

ฉันได้พยายามls *+([[:digit:]]).txtแต่นี้เป็นจริงสำหรับและabc12.txtabc2.txt

abc2.txtแต่ผมจำเป็นต้องได้รับเท่านั้น ฉันจะทำสิ่งนั้นได้อย่างไร

มีรูปแบบใด:digit:ที่จะทำเช่นนี้?


2
รูปแบบที่มันควรจะสังเกตจะใช้ได้เฉพาะกับglobbing ขยายshopt -s extglob endabled:
donothingsuccessfully

คำตอบ:


20

เกี่ยวกับ:

ls *[!0-9][0-9].txt

!ที่จุดเริ่มต้นของกลุ่มในการเติมเต็มความหมายของมัน

ตามที่ระบุไว้ในความคิดเห็นนี่เป็นการทุบตีลองเช่น:

printf "%s\n" *[!0-9][0-9].txt

3
โปรดทราบว่า bash (ie ls) ไม่รองรับนิพจน์ทั่วไปที่นี่ เหล่านี้เป็นสำนวนที่ชื่อไฟล์ (globbing) คุณสามารถเห็นความแตกต่างในตัวอย่างของคุณได้แล้ว: ที่นี่*เป็นสัญลักษณ์แทนซึ่งไม่ได้มีอยู่ในนิพจน์ทั่วไปที่คุณจะใช้.*เพื่อให้บรรลุเหมือนกัน การแสดงออกปกติมีประสิทธิภาพมากกว่าการโค้งงอมาก
Christopher K.

2

คำถามถามถึงนิพจน์ทั่วไป 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เพื่อค้นหาว่าระบบของคุณรองรับอะไรบ้าง


0

ด้วย ksh ที่ขยาย globs (หรือbash -O extglobหรือzsh -o kshglob) ที่คุณใช้อยู่นั่นจะเป็น:

ls -d -- ?(*[![:digit:]])[[:digit:]].txt

หรือ

ls -d -- !(*[[:digit:]])[[:digit:]].txt

ถ้าคุณต้องการเพื่อให้ตรงกับบนa1.txt และ2.txtแต่ไม่ว่ามิได้a12.txt12.txt

อย่างไรก็ตามโปรดทราบว่าใน ksh และ bash (ยกเว้นกรณีที่คุณตั้งค่าfailglobตัวเลือกเพื่อให้มีพฤติกรรมคล้ายกับ zsh's) หากรูปแบบนั้นไม่ตรงกับไฟล์ใด ๆ รูปแบบจะถูกส่งผ่านไปที่แท้จริงlsและหากไฟล์นั้น (ชื่อแปลก) เกิดขึ้น มีอยู่แล้วมันจะถูกระบุด้วยlsแม้ว่าจะไม่ตรงกับรูปแบบของตัวเอง

จะรวมถึงการ.2.txtตั้งค่าdotglobตัวเลือกในการbashเพิ่ม(D)รอบคัดเลือก glob ในzshหรือชุดFIGNOREไปใน!(.|..)ksh93

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