কমান্ডলাইন ব্যবহার করে একটি নির্দিষ্ট পিক্সেল আকারের সমস্ত চিত্র কীভাবে সন্ধান করবেন?


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 '$1<300||$2<300'বা | awk '$1<300||$2<300{print $3}'(যখন কেবল তৃতীয় কলামটি প্রয়োজন)।
har-wradim

@ হার-ওয়াদিম ধন্যবাদ, সুন্দর পরামর্শ!
জেরহার্ড বার্গার

7
'%w %h %i\n'এটি আমার পক্ষে কাজ করার জন্য আমাকে একটি নতুন লাইন যুক্ত করতে হয়েছিল ।
qwr

একটি 6 বছরের প্রশ্নে লেখার জন্য দুঃখিত, তবে গুগলে এটিই আমি খুঁজে পাই যা আংশিকভাবে আমার প্রশ্নকে আরোপ করে, মূলত যা আমি চাই তা নির্দিষ্ট মাত্রার সাথে বা তার মধ্যে থাকা চিত্রগুলি খুঁজে পেতে এবং সেগুলি অন্য ডিরেক্টরিতে অনুলিপি করে। আমি জানি যে সিপি কপি করার জন্য ব্যবহৃত হয়, তবে আমি সিপির সাথে এই আদেশটি সংহত করতে ব্যর্থ হয়েছি।
ঘোস্টআর্ডার

@ গোস্টআর্ডার কেবলমাত্র তৃতীয় কলামটি মুদ্রণ করার জন্য @ হার-ওয়াদিমের পরামর্শ অনুসরণ করুন, তারপরে এই জাতীয় কিছু দিয়ে অন্য পাইপ যুক্ত করুন| 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নির্দিষ্ট আকারের নীচে জেপিইজি ফাইলগুলি সরানোর জন্য এটি ব্যবহার করা সহজ হবে :

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

( -deleteপ্রথমে এটি চালানো ব্যতীত দৌড়ে যাওয়া আপনার যে জিনিস রাখতে চান তা খুঁজে পায় না - এটি অন্যথায় মোছার আগে আপনাকে অনুরোধ করবে না)।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.