วิธีใช้คำสั่ง find เพื่อค้นหาไฟล์ทั้งหมดที่มีนามสกุลจากรายการ


179

ฉันต้องการค้นหาไฟล์รูปภาพทั้งหมดจากไดเรกทอรี (gif, png, jpg, jpeg)

find /path/to/ -name "*.jpg" > log

จะแก้ไขสตริงนี้เพื่อค้นหาไฟล์. jpg ได้อย่างไร?

คำตอบ:


191
find /path/to -regex ".*\.\(jpg\|gif\|png\|jpeg\)" > log

6
ใช้งานไม่ได้กับฉันบน mac แต่ทำงานกับตัวเลือก -E (ส่วนขยาย) (บางทีไพพ์เป็นคุณสมบัติเพิ่มเติมหรือไม่): find -E / path / to -iregex ". * \. (jpg | gif | png | jpeg) "> log
ling

138
find /path/to/  \( -iname '*.gif' -o -iname '*.jpg' \) -print0

จะทำงาน. อาจมีวิธีที่สง่างามกว่านี้


16
- ชื่อจะไม่ตรงตามตัวพิมพ์ใหญ่และตัวพิมพ์ใหญ่
Chris Koston

1
@Gerald: เป็นไปได้ว่าคุณจะต้องจัดกลุ่ม OR ของคุณในวงเล็บที่ถูกหลีกเลี่ยงfind /path/to/ \( -iname '*.gif' -o -iname '*.jpg' \) -exec ls -l {} \;มิฉะนั้นผู้บริหารจะใช้กับส่วนสุดท้ายเท่านั้น ( -iname '*.jpg' ในกรณีนี้)
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

นั่นเป็นคำพูดที่สำคัญ find /path/to/ -iname '*.gif' -o -iname '*.jpg' -print0จะพิมพ์ไฟล์ jpg เท่านั้น! คุณต้องใช้ตัวยึดที่นี่:find /path/to/ \( -iname '*.gif' -o -iname '*.jpg' \) -print0
Anne van Rossum

28

find -E /path/to -regex ".*\.(jpg|gif|png|jpeg)" > log

-Eช่วยให้คุณประหยัดจากที่มีการหลบหนี parens และท่อใน regex ของคุณ


2
การค้นหาของฉันไม่มีสิ่งนี้ -E
wieczorek1990

1
อืม-Eตัวเลือกบอกfindให้ใช้ "การแสดงออกปกติเพิ่มเติม" เครื่องมืออื่น ๆ หลายตัวมีตัวเลือกที่คล้ายกัน แต่ฉันไม่แน่ใจว่าตัวเลือกนี้มีอยู่ในการกระจาย UNIX ทั้งหมด
tboyce12

8
ทำงานบน Mac OS ได้เช่นกัน
c.gutierrez

2
@ tboyce12 ทำงานบน Ubuntu, ฉันสามารถระบุ -regextype เพื่อลดความซับซ้อนของการแสดงออก regex find . -regextype posix-extended -regex ".*\.(jpg|gif|png|jpeg)"นี้:
doub1ejack

1
@cjm find -E /path/to -iregex ".*\.(jpg|gif|png|jpeg)" > logบางที การใช้-iregexแฟล็กบอกfindให้จับคู่ตัวพิมพ์เล็กและใหญ่
tboyce12

11
find /path/to/ -type f -print0 | xargs -0 file | grep -i image

สิ่งนี้ใช้ fileคำสั่งเพื่อพยายามจดจำชนิดของไฟล์โดยไม่คำนึงถึงชื่อไฟล์ (หรือนามสกุล)

หาก/path/toหรือชื่อไฟล์มีสตริงimageแล้วข้างต้นอาจกลับมาฮิตปลอม ในกรณีนั้นฉันขอแนะนำ

cd /path/to
find . -type f -print0 | xargs -0 file --mime-type | grep -i image/

ขออภัยมีการคลิกผิดพลาดที่นั่นและเห็นได้ชัดว่าฉันไม่สามารถเลิกการโหวต ... : (
Mark Simpson

6
find /path -type f \( -iname "*.jpg" -o -name "*.jpeg" -o -iname "*gif" \)

2
คุณช่วยอธิบายได้ไหมว่าทำไมคุณถึงเพิ่มวงเล็บ (หนี) รอบ ๆ พารามิเตอร์ชื่อ / iname?
Bart Kleijngeld

เหตุผลใดที่ทำให้เกิดความไม่ลงรอยกัน? -iname *.jpg, -o -name *.jpeg, -o -iname *gifทุกคนมีรูปแบบที่แตกต่างกันเล็กน้อย
รถเข็นที่ถูกทิ้งร้าง

ถ้าอย่างน้อยคุณสามารถอธิบายความแตกต่างกับคำตอบอื่น ๆ
el-teedee

6

ในส่วนเพิ่มเติมของการตอบสนองของ @Dennis Williamson ด้านบนหากคุณต้องการให้ regex เดียวกันไม่ตรงตามตัวพิมพ์ใหญ่กับไฟล์นามสกุลให้ใช้ -iregex:

find /path/to -iregex ".*\.\(jpg\|gif\|png\|jpeg\)" > log



-1

ในกรณีที่ไฟล์ไม่มีนามสกุลเราสามารถค้นหาไฟล์ mime ได้

find . -type f -exec file -i {} + | awk -F': +' '{ if ($2 ~ /audio|video|matroska|mpeg/) print $1 }'

โดยที่ (audio | video | matroska | mpeg) เป็นประเภท mime regex

หากคุณต้องการลบ:

find . -type f -exec file -i {} + | awk -F': +' '{ if ($2 ~ /audio|video|matroska|mpeg/) print $1 }' | while read f ; do
  rm "$f"
done

หรือลบทุกอย่างอื่นยกเว้นส่วนขยายเหล่านั้น:

find . -type f -exec file -i {} + | awk -F': +' '{ if ($2 !~ /audio|video|matroska|mpeg/) print $1 }' | while read f ; do
  rm "$f"
done

สังเกตุ!! ~ แทน ~

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