कमांडलाइन का उपयोग करके एक निश्चित पिक्सेल आकार के साथ सभी छवियों को कैसे खोजें?


16

मैं सबफ़ोल्डर के साथ एक फ़ोल्डर के भीतर सभी जेपीजी छवियों को खोजने की कोशिश कर रहा हूं, जिनकी चौड़ाई या ऊंचाई 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 part को छोटा किया जा सकता है: | awk '$1<300||$2<300'या | awk '$1<300||$2<300{print $3}'(जब केवल 3rd कॉलम की आवश्यकता हो)।
हार्ड-वड्रिम

@ हार्दिक धन्यवाद, अच्छा सुझाव!
गेरहार्ड बर्गर

7
मुझे अपने लिए काम करने के लिए एक नई पंक्ति ( '%w %h %i\n') को जोड़ना पड़ा ।
क्यूर

6 साल के प्रश्न में लिखने के लिए क्षमा करें, लेकिन यह एकमात्र परिणाम है जो मुझे Google पर मिला है जो आंशिक रूप से मेरे प्रश्न का पता लगाता है, मूल रूप से जो मैं चाहता हूं वह विशिष्ट आयामों के साथ या उसके बाद छवियों को ढूंढता है और फिर उन्हें किसी अन्य निर्देशिका में कॉपी करता है। मुझे पता है कि cp को कॉपी करने के लिए उपयोग किया जाता है, लेकिन मैं इस कमांड को cp के साथ एकीकृत करने में विफल रहता हूं।
घोस्टऑडर

@GhostOrder @ har-wradim के सुझाव का पालन करके केवल 3 कॉलम को प्रिंट करते हैं, फिर कुछ इस तरह से एक और पाइप जोड़ते हैं| xargs -I {} mv {} /destination/directory/
गेरहार्ड बर्गर

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जांच के पहले चलने से यह पता नहीं चलता है कि आप किन चीजों को रखना चाहते हैं - यह आपको हटाने से पहले संकेत नहीं देगा)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.