วิธีใช้คำสั่ง find เพื่อค้นหาส่วนขยายหลายรายการ


125

ฉันสามารถรับjpgภาพทั้งหมดโดยใช้:

find . -name "*.jpg"  

แต่ฉันจะเพิ่มpngไฟล์ลงในผลลัพธ์ได้อย่างไร


คำตอบ:


152

ใช้การ-oตั้งค่าสถานะระหว่างพารามิเตอร์ต่าง ๆ

find ./ -type f \( -iname \*.jpg -o -iname \*.png \) ทำงานเหมือนจับใจ

หมายเหตุมีต้องเป็นช่องว่างระหว่างวงเล็บและเนื้อหาของมันหรือมันจะไม่ทำงาน

คำอธิบาย:

  • type -f - ค้นหาเฉพาะไฟล์ (ไม่ใช่ไดเรกทอรี)
  • \(- จำเป็นสำหรับการtype -fใช้กับข้อโต้แย้งทั้งหมด
  • -o - ผู้ประกอบการตรรกะหรือ
  • -iname- ชอบ-nameแต่การแข่งขันไม่คำนึงถึงขนาดตัวพิมพ์

คุณต้องการวงเล็บหรือไม่ คำสั่งใช้งานได้โดยไม่มีพวกเขา พวกมันจำเป็นสำหรับเชลล์บ้างไหม?
MikeD

2
@miked คำสั่งจะ "ทำงาน" โดยไม่มีพวกเขาใช่ แต่คุณต้องการปิดท้ายการเข้าชมไดเรกทอรีที่ลงท้ายด้วย. png รวมถึงไฟล์ที่ลงท้ายด้วย. jpg ซึ่งไม่ตรงกับที่ตั้งใจไว้
Shadur

1
ขอบคุณสำหรับการชี้แจง! The type -fไม่ขยายและนำไปใช้กับทั้งสองนิพจน์โดยไม่มีวงเล็บดังนั้นfind ./ -type f -iname \*.jpg -o -type f -iname \*.pngยังใช้งานได้ ... ถึงแม้ว่ามันจะมีตัวละครสองตัวยาวกว่า :-)
MikeD

2
มันเป็นเรื่องของความสำคัญของผู้ประกอบการ เช่นเดียวกับที่a * b + cแตกต่างจากa * (b + c)
Shadur

2
@jdhao จับดีแก้ไขเพิ่มเติม
Shadur

86

คุณสามารถรวมกับเกณฑ์ที่-oเป็นข้อเสนอแนะโดย Shadur โปรดทราบว่า-oมีความสำคัญต่ำกว่าการตีข่าวดังนั้นคุณอาจต้องการวงเล็บ

find . -name '*.jpg' -o -name '*.png'
find . -mtime -7 \( '*.jpg' -o -name '*.png' \)  # all .jpg or .png images modified in the past week

บน Linux คุณสามารถใช้-regexเพื่อรวมส่วนขยายด้วยวิธีแบบ terser ไวยากรณ์ regexp เริ่มต้นคือ Emacs ( regexps พื้นฐานรวมถึงส่วนขยายบางอย่างเช่น\|สำหรับการสลับ) มีตัวเลือกในการสลับไปยังregexps ขยาย

find -regex '.*\.\(jpg\|png\)'
find -regextype posix-extended -regex '.*\.(jpg|png)'

บน FreeBSD, NetBSD และ OSX คุณสามารถใช้-regexร่วมกับ-Eregexps แบบขยายได้

find -E . -regex '.*\.(jpg|png)'

จะดีกว่าเสมอที่จะใช้-inameแทน-name- จากนั้นคุณจะจับimage.JPGและimage.PnG
ccpizza

40

สิ่งนี้ถูกต้องมากขึ้น:

find . -iregex '.*\.\(jpg\|gif\|png\|jpeg\)$'

10
ทำไมคุณถึงพูดว่า "ถูกต้อง" มากกว่านี้?
เควิน

2
@ Kevin ฉันเดาเพราะ-iregexตรงjpgเช่นเดียวกับJPG Jpg jpGและเช่น ฉันคิดว่า$ไม่จำเป็น
ott--

นี้ทำงานได้ดีบนMinGW
Peter Mortensen

2
ก่อนอื่นคุณข้ามโฟลเดอร์การค้นหาเป็นอาร์กิวเมนต์แรกซึ่งจะทำให้เกิดข้อผิดพลาด ประการที่สองในการหนี OSX วงเล็บจะไม่ทำงานและควรใช้แทน: find -E . -iregex '.*\.(jpg|png|gif)'ดังแสดงในคำตอบ @ sorin
ccpizza

8

เพื่อให้ชัดเจนตัวเลือกเดียวที่ใช้งานได้กับ Linux, Unix และ macOS รสคือ:

find -E . -regex '.*\.(jpg|png)'

นั่นเป็นเพราะเวอร์ชั่น OS X แตกต่างกันเล็กน้อย แต่สิ่งสำคัญคือการเขียนสิ่งต่าง ๆ ที่เข้ากันได้ดีกับแพลตฟอร์มส่วนใหญ่


2
แฟ
ล็

แฟล็ก -E ไม่ถูกต้องบนMinGWเช่นกัน (อย่างน้อยรุ่น / การตั้งค่าที่ฉันลองใช้ (การกำหนดค่าเริ่มต้นสำหรับรุ่นเฉพาะ))
Peter Mortensen

ส่วนใดของ-type f \( -iname \*.png -o -iname \*.jpg\)OSX ที่ไม่ทำงาน
Shadur

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