find คำสั่งที่มีตัวนับ regex เช่น {1,2}


14

ฉันพยายามสร้างสตริงคำสั่ง find ที่จะค้นหาไฟล์ทั้งหมดที่ลงท้ายด้วยหมายเลข 1-99 แต่ไม่รวมไฟล์อื่นทั้งหมด

เช่นฉันต้องการค้นหาmyfile1 myfile99แต่ไม่ใช่myfile456และไม่ใช่myfilebackup

regex ที่ฉันคิดคือคือmyfile[1-9]{1,2}แต่ฉันไม่สามารถทำงานกับการค้นหา

find . -regex '.*myfile[0-9]{1,2}' หรือ find . -iname 'myfile[0-9]{1,2}'

จากสิ่งที่ฉันเห็นมันเป็น{1,2}ส่วนที่ไม่ทำงาน

(โดยวิธีการที่คุณสามารถใช้-name -regexinterchangably?)

ความช่วยเหลือใด ๆ ที่ชื่นชม


1
-iname(และ-name) ใช้globsซึ่งไม่มีไวยากรณ์นี้
l0b0

คำตอบ:


10

คุณสามารถลอง

find . -regex '.*myfile[0-9][0-9]?'

หรือ

find . \( -name "myfile[0-9][0-9]" -o -name "myfile[0-9]" \)

ขอบคุณ - บรรทัดแรกใช้งานได้สำหรับฉัน ฉันลองมันด้วยชื่อ - แต่ฉันไม่คิดว่ามันรองรับไวยากรณ์หรืออื่น ๆ ที่ฉันทำอะไรผิด
Lukas88

17

หากคุณมี GNU คุณสามารถใช้ประเภทนิพจน์ทั่วไปอื่นได้:

find . -regextype sed -regex '.*myfile[0-9]\{1,2\}'

ตาม GNU findใช้ไวยากรณ์นิพจน์ปกติของ Emacs neutered โดยค่าเริ่มต้น - Emacs รองรับไวยากรณ์ แต่อย่างน้อย GNU ไม่สนับสนุน\{from,to\}find

แปลกคู่มืออ้างอิงไม่รวมส่วนในsedไวยากรณ์การแสดงออกปกติดังนั้นใครจะรู้ว่าส่วนใดของมันได้รับการสนับสนุน


1
sedเหมือนedน่าจะเป็นนามแฝงสำหรับposix-basicดังนั้นควรจะเข้ากันได้กับ POSIX BRE (แม้ว่าสนับสนุนส่วนขยายบางอย่างเช่น\+) มันเข้ากันไม่ได้กับ GNU sedที่อินสแตนซ์[\n]ตรงกับขึ้นบรรทัดใหม่แทนแบ็กสแลชหรือnPOSIX ที่ต้องการ ดูเพิ่มเติมที่-regextype posix-extendedPOSIX EREs (เช่นนั้น.*myfile[0-9]{1,2}) พร้อมส่วนขยายเช่น\sหรือ\<
Stéphane Chazelas

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