ฉันต้องการค้นหาไฟล์รูปภาพทั้งหมดจากไดเรกทอรี (gif, png, jpg, jpeg)
find /path/to/ -name "*.jpg" > log
จะแก้ไขสตริงนี้เพื่อค้นหาไฟล์. jpg ได้อย่างไร?
ฉันต้องการค้นหาไฟล์รูปภาพทั้งหมดจากไดเรกทอรี (gif, png, jpg, jpeg)
find /path/to/ -name "*.jpg" > log
จะแก้ไขสตริงนี้เพื่อค้นหาไฟล์. jpg ได้อย่างไร?
คำตอบ:
find /path/to -regex ".*\.\(jpg\|gif\|png\|jpeg\)" > log
find /path/to/ \( -iname '*.gif' -o -iname '*.jpg' \) -print0
จะทำงาน. อาจมีวิธีที่สง่างามกว่านี้
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
find -E /path/to -regex ".*\.(jpg|gif|png|jpeg)" > log
-E
ช่วยให้คุณประหยัดจากที่มีการหลบหนี parens และท่อใน regex ของคุณ
-E
ตัวเลือกบอกfind
ให้ใช้ "การแสดงออกปกติเพิ่มเติม" เครื่องมืออื่น ๆ หลายตัวมีตัวเลือกที่คล้ายกัน แต่ฉันไม่แน่ใจว่าตัวเลือกนี้มีอยู่ในการกระจาย UNIX ทั้งหมด
find . -regextype posix-extended -regex ".*\.(jpg|gif|png|jpeg)"
นี้:
find -E /path/to -iregex ".*\.(jpg|gif|png|jpeg)" > log
บางที การใช้-iregex
แฟล็กบอกfind
ให้จับคู่ตัวพิมพ์เล็กและใหญ่
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/
find /path -type f \( -iname "*.jpg" -o -name "*.jpeg" -o -iname "*gif" \)
-iname *.jpg
, -o -name *.jpeg
, -o -iname *gif
ทุกคนมีรูปแบบที่แตกต่างกันเล็กน้อย
ในส่วนเพิ่มเติมของการตอบสนองของ @Dennis Williamson ด้านบนหากคุณต้องการให้ regex เดียวกันไม่ตรงตามตัวพิมพ์ใหญ่กับไฟล์นามสกุลให้ใช้ -iregex:
find /path/to -iregex ".*\.\(jpg\|gif\|png\|jpeg\)" > log
สำหรับการใช้งาน Mac OS
find -E packages -regex ".*\.(jpg|gif|png|jpeg)"
find -regex ".*\.\(jpg\|gif\|png\|jpeg\)"
ในกรณีที่ไฟล์ไม่มีนามสกุลเราสามารถค้นหาไฟล์ 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
สังเกตุ!! ~ แทน ~