จะค้นหารูปภาพทั้งหมดที่มีขนาดพิกเซลที่แน่นอนโดยใช้ commandline ได้อย่างไร


16

ฉันพยายามค้นหาภาพ JPG ทั้งหมดภายในโฟลเดอร์ที่มีโฟลเดอร์ย่อยที่มีความกว้างหรือความสูงต่ำกว่า 300px

วิธีนี้ฉันต้องการตรวจจับภาพขนาดย่อเก่าและลบออก

แน่นอนฉันสามารถค้นหาภาพทั้งหมดโดยใช้find:

find . -iname "*.jpg" -type f | ...

แต่สิ่งที่ตามมาหลังจากท่อ? ฉันสามารถใช้แพคเกจใดเพื่อตรวจสอบคุณสมบัติของรูปภาพ

คำตอบ:


17

คุณสามารถใช้identifyจากimagemagickและคุณสามารถใช้คำสั่งต่อไปนี้:

find . -iname "*.jpg" -type f -exec identify -format '%w %h %i' '{}' \; | awk '$1<300 || $2<300'

การใช้-exec <command> '{}' \;ทำให้แน่ใจว่าชื่อไฟล์ของคุณสามารถมีช่องว่างในนั้นหรือคุณสามารถใช้

find . -iname "*.jpg" -type f | xargs -I{} identify -format '%w %h %i' {} | awk '$1<300 || $2<300'

ที่ซึ่ง-I{}ดูแลสิ่งเดียวกัน

สิ่งที่ฉันชอบidentifyคือคุณสามารถระบุรูปแบบผลลัพธ์ ในกรณีนี้'%w %h %i'ให้ความกว้างความสูงและชื่อพา ธ แบบเต็มของภาพ จากนั้นawkนิพจน์จะเก็บเฉพาะเส้นที่มีขนาดเล็กกว่าขนาดที่ต้องการ

ตัวอย่างของการส่งออก:

64 64 ./thumbsup.jpg
100 150 ./photomin.jpg

แก้ไข: ถ้าคุณต้องการชื่อไฟล์เท่านั้น (ท่อเพื่อrmเป็นต้น) เพียงแค่เปลี่ยน$lineในawkคำสั่งให้$3แล้วมันจะพิมพ์คอลัมน์ที่สาม


3
ส่วน awk สามารถทำให้สั้นกว่า: | awk '$1<300||$2<300'หรือ| awk '$1<300||$2<300{print $3}'(เมื่อต้องการเฉพาะคอลัมน์ที่ 3)
har-wradim

@ har-wradim ขอบคุณคำแนะนำดี ๆ !
แกร์ฮาร์ดเบอร์เกอร์

7
ฉันต้องเพิ่มบรรทัดใหม่ ( '%w %h %i\n') เพื่อให้มันใช้งานได้สำหรับฉัน
qwr

ขออภัยที่เขียนในคำถาม 6 ปี แต่นี่เป็นผลลัพธ์เดียวที่ฉันพบใน google ที่บางส่วน asnwers คำถามของฉันโดยทั่วไปสิ่งที่ฉันต้องการคือการค้นหาภาพที่มีหรือภายในมิติที่เฉพาะเจาะจงแล้วคัดลอกไปยังไดเรกทอรีอื่น ฉันรู้ว่า cp ใช้เพื่อคัดลอก แต่ฉันไม่สามารถรวมคำสั่งนี้กับ cp ได้
GhostOrder

@GhostOrder ทำตามคำแนะนำของ @ har-wradim เพื่อพิมพ์คอลัมน์ที่ 3 เท่านั้นจากนั้นเพิ่มไปป์อื่นด้วยสิ่งนี้| xargs -I {} mv {} /destination/directory/
Gerhard Burger

1

ฉันคิดว่าคำตอบที่ยอมรับนั้นดีมาก แต่ฉันต้องการเพิ่มวิธีแก้ปัญหาอื่นที่เป็นไปได้ ...

แม้ว่าฉันจะใช้ImageMagickเครื่องมือบ่อยที่สุดตอนนี้ตัวเองnetpbmเป็นเพื่อนเก่าสำหรับการประมวลผลภาพ คุณสามารถดูขนาดของรูปแบบของภาพด้วยคำสั่ง:

anytopnm file | pamfile

สิ่งนี้จะสร้างผลลัพธ์ที่ดูเหมือน:

stdin:  PPM raw, 1650 by 1275  maxval 255

เพื่อตอบคำถามของ "สิ่งที่ตามมาหลังจากไปป์" ฉันใช้while readบ่อยกว่าที่ฉันใช้xargsเพราะมีความยืดหยุ่นมากกว่า netpbmคำตอบของฉันสำหรับคำถามมีลักษณะดังนี้:

find -iname \*.jpg | while read img; do \
  anytopnm "$img" | pamfile | \
    perl -ane 'exit 1 if $F[3]<300 || $F[5]<300' || rm -v "$img"; \
done

1

สิ่งนี้ใช้ได้กับฉัน:

find . -iname "*.png" -type f -exec identify -format '%i %wx%h\n' '{}' \; | grep '75x75'

นี่คือตัวอย่างผลลัพธ์:

./2520161636481000.png 75x75

./2620160819191100.png 75x75

./2420181545550700.png 75x75


0

identifyคำสั่งจากimagemagickแพคเกจไม่สิ่งที่คุณต้องการ:

$ identify abc.jpg
abc.jpg JPEG 1952x3264 1952x3264+0+0 8-bit DirectClass 1.111MB 0.000u 0:00.000

อีกครั้งคุณจะต้องใช้grepเพื่อจัดเรียงขนาดภาพ

อย่างไรก็ตามฉันสงสัยว่าถ้าคุณมีขนาดภาพที่กว้างมากมันจะเป็นการง่ายกว่าที่จะใช้findเพื่อลบไฟล์ JPEG ด้านล่างตามขนาดที่กำหนด:

find -iname '*.jpg' -size -10k -delete

(ควรดำเนินการโดยไม่มี-deleteการตรวจสอบก่อนไม่พบสิ่งที่คุณต้องการเก็บไว้ - จะไม่แจ้งให้คุณทราบก่อนที่จะลบอย่างอื่น)

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