การใช้ `find 'สำหรับหลายนามสกุลไฟล์


16

ฉันใช้คำสั่งต่อไปนี้เพื่อนับบรรทัดข้อความในไฟล์ JAVA:

find . -name '*.java' | xargs wc -l

ฉันจะแก้ไขfindพารามิเตอร์คำสั่งเพื่อจับคู่มากกว่าหนึ่งนามสกุลไฟล์ได้อย่างไร ตัวอย่างเช่นฉันต้องการใช้การทำงานด้านบนสำหรับไฟล์ CPP, C และ H


คำถามนี้เป็นจริงเกี่ยวกับfindคำสั่งเนื่องจากเป็นที่ที่คุณค้นหาไฟล์ที่ตรงกัน
iglvzx

1
นอกจากนี้ยังใช้ทั้งสร้างหรือดียิ่งขึ้นและง่าย:find -print0 | xargs -0 find . -name '*.cpp' -o -name '*.c' -o -name '*.h' -exec wc -l {} +วิธีนี้จะหลีกเลี่ยงปัญหาเกี่ยวกับชื่อไฟล์ (ช่องว่างบรรทัดใหม่และอื่น ๆ ) และเป็นแบบกำหนดเองที่ดีมาก
Daniel Andersson

คำตอบ:


16

ใช้-oตัวเลือกสำหรับ OR ตัวอย่างเช่นนี้จะรายการ.cpp, .cและ.hไฟล์:

find . -name \*.cpp -o -name \*.c -o -name \*.h

อา. *ความต้องการไม่มีที่จะหนีถ้าจัดรูปแบบเป็นรหัส มองข้ามไปโดยสิ้นเชิงว่า :)
iglvzx

ใช่ใช้การแก้ไขสามครั้งโดยคนสองคน แต่เราได้รับแล้ว
JOTN

2
สิ่งนี้ไม่ได้ผลสำหรับฉันใน OSX (ตรงกับ -name * .ext สุดท้ายเท่านั้น) - ฉันต้องใช้วงเล็บตามที่ @smokinguns แนะนำด้านล่าง
Gilead

2

คุณจะต้องใช้ตัวเลือก -o ตัวอย่างเช่นคำสั่งด้านล่างค้นหาไฟล์ png, jpg และ gif ทั้งหมดในโฟลเดอร์

find . \( -iname \*.png -o -iname \*.jpg -o -iname \*.gif \)

ฉันใช้ตัวเลือก -iname เพื่อให้การจับคู่เป็นตัวพิมพ์เล็กและใหญ่


1
iname ไม่สามารถใช้ได้กับการค้นหาทุกรุ่น
JOTN


1

ในขณะที่คำตอบทั้งหมดเหมือนกันมากหรือน้อยฉันไม่พบคำตอบที่อ่านได้หลายชื่อและตัวดำเนินการบูลีน

ฉันคิดว่านี่อาจเป็นทางออกที่สง่างามกว่า:

$ find . -type f | grep -E "\.java$|\.cpp$|\.c$"

มาแยกกัน

  • find . ค้นหาไฟล์ทั้งหมดซ้ำในเส้นทางปัจจุบัน (เปลี่ยนเป็นเส้นทางอื่นหากคุณต้องการ)
  • -type fจำกัด การค้นหาเฉพาะไฟล์เท่านั้น (ไม่ จำกัด ความเร็ว แต่ยัง ... )
  • | grep -Eฉันใช้สิ่งนี้เพื่อรับgrepรู้จักหรือ ( |) ตัวดำเนินการใน Mac OS X ซึ่งใช้grep FreeBSD , grep GNU ไม่ต้องการ (ตรวจสอบในmanไฟล์ของคุณ)
  • "\.java$|\.cpp$|\.c$"แสดงออกปกติซึ่งรวมถึงไฟล์ที่มีชื่อปลายด้วย.java, .cppและ.c(คนเพิ่มที่คุณต้องการ)

จากนั้นคุณสามารถไพพ์รายการผลลัพธ์สำหรับการประมวลผลเพิ่มเติมเช่น

$ find . -type f | grep -E "\.java$|\.cpp$|\.c$" | xargs sed -i '' $'/s/\r$//'

ตัวอย่างนี้ลบCRLFบรรทัดDOS / Windows ที่ลงท้ายด้วย OS X / Linux LF(นี่เป็นsedไวยากรณ์OS X ตรวจสอบรุ่นเฉพาะของคุณด้วย)


ฉันต้องการค้นหาไฟล์วิดีโอทุกประเภทโดยใช้พารามิเตอร์การจับคู่ส่วนขยาย 25 แบบที่แตกต่างกัน นี่เป็นวิธีการเดียวที่เหมาะกับฉัน (Ubuntu 14.04 LTS)
ผู้สูงอายุ Geek

0

ใช้

find path/to/dir -name "*.ext1" -o -name "*.ext2"

คำอธิบาย

  1. พารามิเตอร์แรกคือไดเรกทอรีที่คุณต้องการค้นหา
  2. โดยค่าเริ่มต้น findจะเรียกซ้ำ
  3. ยืน-o -orดังนั้นด้านบนหมายถึงการค้นหาไวด์การ์ดนี้หรืออันนี้ หากคุณมีรูปแบบเดียวเท่านั้นก็ไม่จำเป็นต้องใช้-oหากคุณมีเพียงรูปแบบหนึ่งแล้วไม่มีความจำเป็นในการ
  4. จำเป็นต้องใช้เครื่องหมายคำพูดล้อมรอบลวดลายตัวแทน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.