কম্পিউটার

বাশে কীভাবে লুপ লিখবেন

মানুষ ইউনিক্স শেল শিখতে চায় এমন একটি সাধারণ কারণ হল ব্যাচ প্রক্রিয়াকরণের শক্তি আনলক করা। আপনি যদি অনেক ফাইলে কিছু সেট অ্যাকশন সঞ্চালন করতে চান, তবে এটি করার একটি উপায় হল সেই ফাইলগুলির উপর পুনরাবৃত্তি করে এমন একটি কমান্ড তৈরি করা। প্রোগ্রামিং পরিভাষায়, একে বলা হয় এক্সিকিউশন কন্ট্রোল, এবং এর সবচেয়ে সাধারণ উদাহরণগুলির মধ্যে একটি হল এর জন্য লুপ।

একটি এর জন্য লুপ হল একটি রেসিপি যা আপনি আপনার কম্পিউটারের জন্য করতে চান তা বর্ণনা করে আপনার নির্দিষ্ট করা প্রতিটি ডেটা অবজেক্ট (যেমন একটি ফাইল)।

লুপের ক্লাসিক

চেষ্টা করার জন্য একটি সহজ লুপ যা ফাইলগুলির একটি সংগ্রহ বিশ্লেষণ করে। এটি সম্ভবত নিজের থেকে একটি দরকারী লুপ নয়, তবে এটি নিজেকে প্রমাণ করার একটি নিরাপদ উপায় যে আপনার কাছে একটি ডিরেক্টরিতে প্রতিটি ফাইল পৃথকভাবে পরিচালনা করার ক্ষমতা রয়েছে। প্রথমত, একটি ডিরেক্টরি তৈরি করে এবং এতে কিছু ফাইলের কিছু কপি রেখে একটি সাধারণ পরীক্ষার পরিবেশ তৈরি করুন। যেকোন ফাইল প্রাথমিকভাবে কাজ করবে, কিন্তু পরবর্তী উদাহরণগুলির জন্য গ্রাফিক ফাইল প্রয়োজন (যেমন JPEG, PNG, বা অনুরূপ)। আপনি ফোল্ডার তৈরি করতে পারেন এবং ফাইল ম্যানেজার ব্যবহার করে বা টার্মিনালে ফাইল কপি করতে পারেন:

$ mkdir উদাহরণ
      $ cp ~/Pictures/vacation/*.{png,jpg} উদাহরণ

আপনার নতুন ফোল্ডারে ডিরেক্টরি পরিবর্তন করুন, তারপর আপনার পরীক্ষার পরিবেশ আপনি যা আশা করেন তা নিশ্চিত করতে এতে ফাইলগুলি তালিকাভুক্ত করুন:

$ cd উদাহরণ
$ ls -1
cat.jpg
design_maori.png
otago.jpg
waterfall.png

প্রতিটি ফাইলকে আলাদাভাবে লুপে লুপ করার জন্য সিনট্যাক্স হল:একটি ভেরিয়েবল তৈরি করুন (f ফাইলের জন্য, উদাহরণস্বরূপ)। তারপরে আপনি যে ডেটা সেটটি পরিবর্তন করতে চান তা নির্ধারণ করুন। এই ক্ষেত্রে, * ব্যবহার করে বর্তমান ডিরেক্টরির সমস্ত ফাইলের মধ্যে সাইকেল করুন ওয়াইল্ডকার্ড অক্ষর (* ওয়াইল্ডকার্ড সবকিছুর সাথে মেলে ) তারপর একটি সেমিকোলন (;) দিয়ে এই পরিচায়ক ধারাটি শেষ করুন )।

$ for f in * ; 

আপনার পছন্দের উপর নির্ভর করে, আপনি রিটার্ন টিপতে বেছে নিতে পারেন এখানে. শেলটি সিনট্যাক্টিক্যালি সম্পূর্ণ না হওয়া পর্যন্ত লুপ চালানোর চেষ্টা করবে না।

এর পরে, লুপের প্রতিটি পুনরাবৃত্তির সাথে আপনি কী ঘটতে চান তা সংজ্ঞায়িত করুন। সরলতার জন্য, ফাইল ব্যবহার করুন f দ্বারা উপস্থাপিত প্রতিটি ফাইল সম্পর্কে সামান্য কিছু ডেটা পেতে কমান্ড পরিবর্তনশীল (কিন্তু একটি $ দিয়ে আগে লেখা ভেরিয়েবলে বর্তমানে যা আছে তার জন্য ভেরিয়েবলের মান অদলবদল করতে শেলকে বলুন:

do file $f ; 

অন্য সেমি-কোলন দিয়ে ক্লজটি বন্ধ করুন এবং লুপ বন্ধ করুন:

done 

রিটার্ন টিপুন সবকিছুর মাধ্যমে শেল সাইক্লিং শুরু করতে বর্তমান ডিরেক্টরিতে। এর জন্য লুপ ভেরিয়েবল f প্রতিটি ফাইলকে একে একে বরাদ্দ করে এবং আপনার কমান্ড চালায়:

$ f এর জন্য *; do
     > ফাইল $f;
     > সম্পন্ন
      cat.jpg:JPEG ইমেজ ডেটা, EXIF ​​স্ট্যান্ডার্ড 2.2
      design_maori.png:PNG ইমেজ ডেটা, 4608 x 2592, 8-বিট /color RGB, নন-ইন্টারলেসড
        otago.jpg:JPEG ইমেজ ডেটা, EXIF ​​স্ট্যান্ডার্ড 2.2
        waterfall.png:PNG ইমেজ ডেটা, 4608 x 2592, 8-bit/color RGB, অ-ইন্টারলেসড

আপনি এটি এভাবেও লিখতে পারেন:

$ f এর জন্য * মধ্যে; ফাইল করুন $f; সম্পন্ন
      cat.jpg:JPEG ইমেজ ডেটা, EXIF ​​স্ট্যান্ডার্ড 2.2
      design_maori.png:PNG ইমেজ ডেটা, 4608 x 2592, 8-bit/color RGB, অ-ইন্টারলেসড
      otago.jpg:JPEG ইমেজ ডেটা, EXIF ​​স্ট্যান্ডার্ড 2.2
        waterfall.png:PNG ইমেজ ডেটা, 4608 x 2592, 8-বিট/কালার RGB, অ-ইন্টারলেসড

মাল্টি-লাইন এবং একক-লাইন উভয় ফর্ম্যাটই আপনার শেলের জন্য একই এবং একই ফলাফল দেয়।

একটি ব্যবহারিক উদাহরণ

প্রতিদিনের কম্পিউটিংয়ের জন্য কীভাবে একটি লুপ কার্যকর হতে পারে তার একটি বাস্তব উদাহরণ এখানে। ধরুন আপনার কাছে ছুটির ছবিগুলির একটি সংগ্রহ রয়েছে যা আপনি বন্ধুদের পাঠাতে চান৷ আপনার ফটো ফাইলগুলি বিশাল, সেগুলিকে ইমেলের জন্য খুব বড় করে তোলে এবং আপনার ফটো-শেয়ারিং পরিষেবাতে আপলোড করতে অসুবিধাজনক৷ আপনি আপনার ফটোগুলির ছোট ওয়েব-সংস্করণ তৈরি করতে চান, কিন্তু আপনার কাছে 100টি ফটো রয়েছে এবং প্রতিটি ফটোকে একে একে কমাতে সময় ব্যয় করতে চান না৷

প্রথমে ImageMagick ইনস্টল করুন Linux, BSD, বা Mac-এ আপনার প্যাকেজ ম্যানেজার ব্যবহার করে কমান্ড। উদাহরণস্বরূপ, ফেডোরা এবং আরএইচইএল-এ:

$ sudo dnf install ImageMagick 

উবুন্টু বা ডেবিয়ানে:

$ sudo apt install ImageMagick 

BSD তে, পোর্ট ব্যবহার করুন অথবা pkgsrc. Mac এ, Homebrew বা MacPorts ব্যবহার করুন।

একবার আপনি ImageMagick ইন্সটল করলে, ফটোতে কাজ করার জন্য আপনার কাছে নতুন কমান্ডের একটি সেট আছে।

আপনি যে ফাইলগুলি তৈরি করতে চলেছেন তার জন্য একটি গন্তব্য ডিরেক্টরি তৈরি করুন:

$ mkdir tmp 

প্রতিটি ফটোকে তার আসল আকারের 33% কমাতে, এই লুপটি চেষ্টা করুন:

$ for f in * ; do convert $f -scale 33% tmp/$f ; done 

তারপর tmp দেখুন আপনার স্কেল করা ফটো দেখতে ফোল্ডার।

আপনি একটি লুপের মধ্যে যেকোন সংখ্যক কমান্ড ব্যবহার করতে পারেন, তাই আপনার যদি ফাইলগুলির একটি ব্যাচে জটিল ক্রিয়া সম্পাদনের প্রয়োজন হয়, আপনি আপনার সম্পূর্ণ কর্মপ্রবাহকে করুন এর মধ্যে রাখতে পারেন এবং হয়েছে একটি এর জন্য বিবৃতি লুপ. উদাহরণ স্বরূপ, ধরুন আপনি প্রতিটি প্রক্রিয়াকৃত ফটো সরাসরি আপনার ওয়েব হোস্টে শেয়ার করা ফটো ডিরেক্টরিতে অনুলিপি করতে চান এবং আপনার স্থানীয় সিস্টেম থেকে ফটো ফাইলটি সরাতে চান:

$ f এর জন্য *; করুন 
    $f -scale 33% tmp/$f
  scp -i seth_web tmp/$f seth@example.com:~/public_html
  ট্র্যাশ tmp/$f;
  সম্পন্ন

এর জন্য দ্বারা প্রক্রিয়া করা প্রতিটি ফাইলের জন্য লুপ, আপনার কম্পিউটার স্বয়ংক্রিয়ভাবে তিনটি কমান্ড চালায়। এর মানে হল আপনি যদি এইভাবে মাত্র 10টি ফটো প্রসেস করেন, তাহলে আপনি নিজেকে 30টি কমান্ড এবং সম্ভবত অন্ততপক্ষে অনেক মিনিট বাঁচাতে পারবেন।

আপনার লুপ সীমিত করা

একটি লুপ সবসময় প্রতিটি ফাইল দেখতে হবে না. আপনি আপনার উদাহরণ ডিরেক্টরিতে শুধুমাত্র JPEG ফাইলগুলি প্রক্রিয়া করতে চাইতে পারেন:

$ f এর জন্য *.jpg; $f -স্কেল 33% tmp/$f রূপান্তর করুন; সম্পন্ন
$ ls -m tmp
cat.jpg, otago.jpg

অথবা, ফাইল প্রক্রিয়াকরণের পরিবর্তে, আপনাকে একটি নির্দিষ্ট সংখ্যক বার একটি ক্রিয়া পুনরাবৃত্তি করতে হতে পারে। একটি এর জন্য লুপের ভেরিয়েবল আপনি যে ডেটা প্রদান করেন তা দ্বারা সংজ্ঞায়িত করা হয়, তাই আপনি একটি লুপ তৈরি করতে পারেন যা ফাইলের পরিবর্তে সংখ্যার উপর পুনরাবৃত্তি করে:

$ n এর জন্য {0..4}; প্রতিধ্বনি করুন $n; সম্পন্ন
0
1
2
3
4

আরো লুপিং

আপনি এখন আপনার নিজের লুপ তৈরি করতে যথেষ্ট জানেন। যতক্ষণ না আপনি লুপ করতে স্বাচ্ছন্দ্য বোধ করছেন, সেগুলি কপি-এ ব্যবহার করুন আপনি যে ফাইলগুলি প্রক্রিয়া করতে চান এবং যতবার সম্ভব, অন্তর্নির্মিত সুরক্ষার সাহায্যে কমান্ডগুলি ব্যবহার করুন যাতে আপনি আপনার ডেটা ক্লোবারিং এবং অপূরণীয় ভুলগুলি করতে না পারেন, যেমন ভুলবশত ফাইলগুলির একটি সম্পূর্ণ ডিরেক্টরিকে একই নামে পুনঃনামকরণ করা, প্রতিটি অন্যটিকে ওভাররাইট করা। .

উন্নত এর জন্য লুপ বিষয়, পড়ুন।

সব শেল ব্যাশ নয়

এর জন্য কীওয়ার্ডটি ব্যাশ শেলের মধ্যে তৈরি করা হয়েছে। অনেক অনুরূপ শেল একই কীওয়ার্ড এবং সিনট্যাক্স ব্যবহার করে, কিন্তু কিছু শেল, যেমন tcsh, একটি ভিন্ন কীওয়ার্ড ব্যবহার করে, যেমন foreach , পরিবর্তে।

tcsh-এ, সিনট্যাক্স স্পিরিট অনুরূপ কিন্তু Bash এর চেয়ে বেশি কঠোর। নিম্নলিখিত কোড নমুনায়, foreach? স্ট্রিং টাইপ করবেন না লাইন 2 এবং 3 এ। এটি একটি সেকেন্ডারি প্রম্পট যা আপনাকে সতর্ক করে যে আপনি এখনও আপনার লুপ তৈরির প্রক্রিয়ার মধ্যে রয়েছেন।

$ foreach f (*)
foreach? ফাইল $f
foreach? end
cat.jpg:JPEG ইমেজ ডেটা, EXIF ​​স্ট্যান্ডার্ড 2.2
design_maori.png:PNG ইমেজ ডেটা, 4608 x 2592, 8-bit/color RGB, অ-ইন্টারলেসড
otago.jpg:JPEG ইমেজ ডেটা, EXIF ​​স্ট্যান্ডার্ড 2.2
waterfall.png:PNG ইমেজ ডেটা, 4608 x 2592, 8-বিট/কালার RGB, অ-ইন্টারলেসড

tcsh-এ, উভয়ই সামনে এবং শেষ পৃথক লাইনে একা উপস্থিত হতে হবে, তাই আপনি একটি জন্য তৈরি করতে পারবেন না ব্যাশ এবং অনুরূপ শেলগুলির সাথে আপনি যেভাবে পারেন এক লাইনে লুপ করুন৷

ফাইন্ড কমান্ড সহ লুপের জন্য

তাত্ত্বিকভাবে, আপনি একটি শেল খুঁজে পেতে পারেন যা এর জন্য প্রদান করে না লুপ ফাংশন, অথবা আপনি যোগ করা বৈশিষ্ট্য সহ একটি ভিন্ন কমান্ড ব্যবহার করতে পছন্দ করতে পারেন।

খোঁজ কমান্ড হল একটি এর জন্য কার্যকারিতা বাস্তবায়নের আরেকটি উপায় লুপ, কারণ এটি আপনার লুপে কোন ফাইলগুলিকে অন্তর্ভুক্ত করতে হবে এবং সেইসাথে সমান্তরাল প্রক্রিয়াকরণের বিকল্পগুলি নির্ধারণ করার বিভিন্ন উপায় প্রদান করে৷

খোঁজ কমান্ড আপনার হার্ড ড্রাইভে ফাইল খুঁজে পেতে সাহায্য করার জন্য বোঝানো হয়। এর সিনট্যাক্স সহজ:আপনি যে অবস্থানটি অনুসন্ধান করতে চান তার পথ প্রদান করেন এবং খুঁজে পান সমস্ত ফাইল এবং ডিরেক্টরি খুঁজে পায়:

$ খুঁজুন। 
.
./cat.jpg
./design_maori.png
./otago.jpg
./waterfall.png

আপনি নামের কিছু অংশ যোগ করে অনুসন্ধান ফলাফল ফিল্টার করতে পারেন:

$ খুঁজুন। -নাম "*jpg"
./cat.jpg
./otago.jpg

খুঁজে সম্পর্কে দুর্দান্ত জিনিস৷ এটি যে প্রতিটি ফাইল খুঁজে পায় তাকে -exec ব্যবহার করে একটি লুপে খাওয়ানো যেতে পারে পতাকা উদাহরণস্বরূপ, আপনার উদাহরণ ডিরেক্টরিতে শুধুমাত্র PNG ফটোগুলিকে স্কেল করতে:

$ খুঁজুন। -নাম "*png" -exec রূপান্তর {} -স্কেল 33% tmp/{} \;
$ ls -m tmp
design_maori.png, waterfall.png

-exec-এ ধারা, বন্ধনী অক্ষর {} যাই হোক না কেন আইটেম খুঁজে নিন জন্য দাঁড়ান প্রক্রিয়া করা হচ্ছে (অন্য কথায়, PNG তে শেষ হওয়া যেকোন ফাইল যেটি একবারে একটি অবস্থান করা হয়েছে)। -exec ক্লজ অবশ্যই সেমিকোলন দিয়ে শেষ করতে হবে, কিন্তু ব্যাশ সাধারণত নিজের জন্য সেমিকোলন ব্যবহার করার চেষ্টা করে। আপনি একটি ব্যাকস্ল্যাশ (\;) সহ সেমিকোলন থেকে "পালাতে" ) যাতে খোঁজে সেমিকোলনটিকে এর সমাপ্তি অক্ষর হিসাবে বিবেচনা করতে জানে।

খোঁজ কমান্ড এটি যা করে তাতে খুব ভাল, এবং এটি কখনও কখনও খুব ভালও হতে পারে। উদাহরণস্বরূপ, আপনি যদি অন্য ফটো প্রক্রিয়ার জন্য PNG ফাইলগুলি খুঁজে পেতে এটি পুনরায় ব্যবহার করেন, আপনি কয়েকটি ত্রুটি পাবেন:

$ খুঁজুন। -নাম "*png" -exec রূপান্তর {} -flip -flop tmp/{} \; 
রূপান্তর:ছবি `tmp/./tmp/design_maori.png' খুলতে অক্ষম:
এমন কোনো ফাইল বা ডিরেক্টরি @ error/blob.c/OpenBlob/2643.
...

মনে হচ্ছে খুঁজে সমস্ত পিএনজি ফাইল রয়েছে—শুধুমাত্র আপনার বর্তমান ডিরেক্টরি (.) নয় ) কিন্তু সেইগুলিও যা আপনি আগে প্রক্রিয়া করেছেন এবং আপনার tmp-এ রেখেছেন৷ সাবডিরেক্টরি কিছু ক্ষেত্রে, আপনি খুঁজে চাইতে পারেন৷ বর্তমান ডিরেক্টরি এবং এটির মধ্যে অন্যান্য সমস্ত ডিরেক্টরি অনুসন্ধান করতে (এবং সেগুলি-এ সমস্ত ডিরেক্টরি ) এটি একটি শক্তিশালী পুনরাবৃত্ত প্রক্রিয়াকরণ টুল হতে পারে, বিশেষ করে জটিল ফাইল স্ট্রাকচারে (যেমন সঙ্গীত শিল্পীদের ডিরেক্টরি যেখানে সঙ্গীত ফাইলে ভরা অ্যালবামের ডিরেক্টরি রয়েছে), তবে আপনি এটিকে -maxdepth দিয়ে সীমাবদ্ধ করতে পারেন বিকল্প।

বর্তমান ডিরেক্টরিতে শুধুমাত্র PNG ফাইলগুলি খুঁজে পেতে (সাবডিরেক্টরিগুলি ব্যতীত):

$ find . -maxdepth 1 -name "*png" 

বর্তমান ডিরেক্টরিতে ফাইলগুলি খুঁজে পেতে এবং প্রক্রিয়া করতে এবং সাবডিরেক্টরিগুলির একটি অতিরিক্ত স্তর, সর্বাধিক গভীরতা 1 দ্বারা বৃদ্ধি করুন:

$ find . -maxdepth 2 -name "*png" 

এটির ডিফল্ট হল সমস্ত সাবডিরেক্টরিতে নামা৷

মজা এবং লাভের জন্য লুপিং

আপনি যত বেশি লুপ ব্যবহার করবেন, তত বেশি সময় এবং শ্রম সাশ্রয় করবেন এবং আপনি যত বড় কাজগুলি মোকাবেলা করতে পারবেন। আপনি শুধুমাত্র একজন ব্যবহারকারী, কিন্তু একটি সুচিন্তিত লুপের সাহায্যে আপনি আপনার কম্পিউটারকে কঠোর পরিশ্রম করতে পারেন৷

আপনি লুপিংকে অন্য যেকোনো কমান্ডের মতো ব্যবহার করতে পারেন এবং করা উচিত, এটিকে হাতের কাছে রেখে যখন আপনাকে একাধিক ফাইলে একটি বা দুটি ক্রিয়া পুনরাবৃত্তি করতে হবে। যাইহোক, এটি গুরুতর প্রোগ্রামিংয়ের একটি বৈধ গেটওয়ে, তাই যদি আপনাকে যেকোন সংখ্যক ফাইলে একটি জটিল কাজ সম্পাদন করতে হয়, আপনার কর্মপ্রবাহের পরিকল্পনা করতে আপনার দিনের কিছু সময় বের করুন। আপনি যদি একটি ফাইলে আপনার লক্ষ্য অর্জন করতে পারেন, তাহলে সেই পুনরাবৃত্তিযোগ্য প্রক্রিয়াটিকে এর জন্য মোড়ানো লুপ তুলনামূলকভাবে সহজ, এবং শুধুমাত্র "প্রোগ্রামিং" এর জন্য প্রয়োজনীয় ভেরিয়েবলগুলি কীভাবে কাজ করে তা বোঝা এবং প্রক্রিয়াকৃত ফাইলগুলি থেকে অপ্রসেসডকে আলাদা করার জন্য যথেষ্ট সংগঠন। সামান্য অনুশীলনের মাধ্যমে, আপনি একজন লিনাক্স ব্যবহারকারী থেকে একজন লিনাক্স ব্যবহারকারীর কাছে যেতে পারেন যিনি লুপ লিখতে জানেন, তাই সেখানে যান এবং আপনার কম্পিউটারকে আপনার জন্য কাজ করে দিন!


  1. কিভাবে উইন্ডোজ 10 এ গিট ব্যাশ ইনস্টল করবেন

  2. কিভাবে একটি Windows 10 রিস্টার্ট লুপ ঠিক করবেন

  3. লুপ কমান্ডের জন্য ব্যাশ কীভাবে ব্যবহার করবেন

  4. নতুনদের জন্য শেল স্ক্রিপ্টিং – কিভাবে লিনাক্সে ব্যাশ স্ক্রিপ্ট লিখতে হয়