ฉันสามารถรับjpg
ภาพทั้งหมดโดยใช้:
find . -name "*.jpg"
แต่ฉันจะเพิ่มpng
ไฟล์ลงในผลลัพธ์ได้อย่างไร
ฉันสามารถรับjpg
ภาพทั้งหมดโดยใช้:
find . -name "*.jpg"
แต่ฉันจะเพิ่มpng
ไฟล์ลงในผลลัพธ์ได้อย่างไร
คำตอบ:
ใช้การ-o
ตั้งค่าสถานะระหว่างพารามิเตอร์ต่าง ๆ
find ./ -type f \( -iname \*.jpg -o -iname \*.png \)
ทำงานเหมือนจับใจ
หมายเหตุมีต้องเป็นช่องว่างระหว่างวงเล็บและเนื้อหาของมันหรือมันจะไม่ทำงาน
คำอธิบาย:
type -f
- ค้นหาเฉพาะไฟล์ (ไม่ใช่ไดเรกทอรี)\(
- จำเป็นสำหรับการtype -f
ใช้กับข้อโต้แย้งทั้งหมด-o
- ผู้ประกอบการตรรกะหรือ-iname
- ชอบ-name
แต่การแข่งขันไม่คำนึงถึงขนาดตัวพิมพ์type -f
ไม่ขยายและนำไปใช้กับทั้งสองนิพจน์โดยไม่มีวงเล็บดังนั้นfind ./ -type f -iname \*.jpg -o -type f -iname \*.png
ยังใช้งานได้ ... ถึงแม้ว่ามันจะมีตัวละครสองตัวยาวกว่า :-)
a * b + c
แตกต่างจากa * (b + c)
คุณสามารถรวมกับเกณฑ์ที่-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
ร่วมกับ-E
regexps แบบขยายได้
find -E . -regex '.*\.(jpg|png)'
-iname
แทน-name
- จากนั้นคุณจะจับimage.JPG
และimage.PnG
สิ่งนี้ถูกต้องมากขึ้น:
find . -iregex '.*\.\(jpg\|gif\|png\|jpeg\)$'
-iregex
ตรงjpg
เช่นเดียวกับJPG Jpg jpG
และเช่น ฉันคิดว่า$
ไม่จำเป็น
find -E . -iregex '.*\.(jpg|png|gif)'
ดังแสดงในคำตอบ @ sorin
เพื่อให้ชัดเจนตัวเลือกเดียวที่ใช้งานได้กับ Linux, Unix และ macOS รสคือ:
find -E . -regex '.*\.(jpg|png)'
นั่นเป็นเพราะเวอร์ชั่น OS X แตกต่างกันเล็กน้อย แต่สิ่งสำคัญคือการเขียนสิ่งต่าง ๆ ที่เข้ากันได้ดีกับแพลตฟอร์มส่วนใหญ่
-type f \( -iname \*.png -o -iname \*.jpg\)
OSX ที่ไม่ทำงาน
find -name
รูปแบบที่ตรงกับรูปแบบหลายรูปแบบที่ SO