ฉันสามารถรับ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ร่วมกับ-Eregexps แบบขยายได้
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