অনুভবী ইউজাররা টার্মিনালে স্মার্টারভাবে কাজ করার উপায় খুঁজেন। xargs একটি উপকারী কমান্ড যা দুটি কমান্ডের ব্রিজ হিসেবে কাজ করে—একটির আউটপুট পড়ে অন্যটি আইটেমসহ এক্সিকিউট করে। প্যাটার্ন সার্চ, ফাইল রিমুভ/রিনেম ইত্যাদিতে এটাকে বেশি ব্যবহার করা হয়।
xargs কী?
বেসিক ফর্মে, xargs স্ট্যান্ডার্ড ইনপুট (STDIN) থেকে ইনফো পড়ে একটি কমান্ড এক বা একাধিকবার আইটেমসহ এক্সিকিউট করে। সহজ ডেমো:
Documents ফোল্ডারে ls রান করতে xargs ব্যবহার:
echo "Documents" | xargs ls
পাইপ ক্যারেক্টার | আগের আউটপুটকে xargs-এর STDIN হিসেবে পাস করে।
Documents ফোল্ডার xargs প্রোব্লেম ছাড়া রিড করল। এটি xargs কমান্ডের ক্যাপাবিলিটির এক উদাহরণ।
xargs বিভিন্ন কমান্ড লাইন অপারেশনে ব্যবহার করা যায়, কিন্তু find কমান্ডের সাথে খুব হ্যান্ডি। এই আর্টিকেলে xargs ও find কম্বাইন্ড ব্যবহার দেখানো হলো।
একাধিক ফাইল ইনভল্ভড অপারেশন
মান लें ref.txt-র কন্টেন্ট এক ডিরেক্টরির সব টেক্সট ফাইলে কপি করতে চান। মাল্টিপল কমান্ড লাগত, কিন্তু xargs + find দিয়ে সিম্পল। আমার টেস্ট ডিরেক্টরি: একটিতে test0.txt (টেক্সট সহ), অন্যটিতে ১০টি খালি টেক্সট ফাইল। test0.txt-র কন্টেন্ট বাকিগুলোতে কপি করতে:
find ./test-dir1/ -name "*.txt" | xargs -n1 cp test0.txt
কমান্ড দুভাগে ভাগ করি:
find ./test-dir1/ -name "*.txt"— test-dir1-এ সব .txt ফাইল সার্চ। যেকোনো ডিরেক্টরি সপেসিফাই করা যায়।xargs -n1 cp test.txt— প্রথম কমান্ডের আউটপুট (ফাইলনেম) নেয়াcpকমান্ডে একে একে পাস করা।-nঅপশন ক্রুশিয়াল—এক এক্সিকিউশনে এক আর্গুমেন্ট ইউজ করার নির্দেশ।
মিলিয়ে দিলে test0.txt-র কন্টেন্ট ডিরেক্টরির সব .txt ফাইলে কপি হয়ে যাবে।
বড় আর্গুমেন্ট লিস্ট ইনভল্ভড অপারেশন
xargs-র বড় সুবিধা: বড় আর্গুমেন্ট লিস্ট হ্যান্ডল করতে পারে। উদাহরণ: অনেক ফাইল একসাথে ডিলিট করলে rm কমান্ড ফেইল করে Argument list too long এরর দিয়ে। কারণ এতো লম্বা আর্গুমেন্ট লিস্ট হ্যান্ডল করতে পারে না। ফোল্ডারে অনেক ফাইল থাকলে এটা হয়।
৭৫টি PDF ডিলিট করতে এরর দিলে xargs দিয়ে ফিক্স:
find ./test-dir2/ -type f -name "*.pdf" -print | xargs rm -f
প্যাটার্ন সার্চ ইনভল্ভড অপারেশন
ডেভেলপার ও সিস্টেম অ্যাডমিন কমান্ড লাইনে খুব প্যাটার্ন সার্চ করেন। ডেভেলপার প্রজেক্ট ফাইল চেক করতে চান যেগুলো নির্দিষ্ট ভেরিয়েবল মডিফাই করে, বা অ্যাডমিন সিস্টেম কনফিগ প্যারামিটার ইউজ করা ফাইল চান। xargs + find + grep দিয়ে সহজ হয়।
সব .txt ফাইল যেগুলো maketecheasier স্ট্রিং কন্টেইন করে সার্চ:
find ./ -name "*.txt" | xargs grep "maketecheasier"
কাট/কপি অপারেশন
xargs + find দিয়ে ফাইল সেট এক ডিরেক্টরি থেকে অন্যে কপি/মুভ করা যায়। কারেন্ট ডিরেক্টরি থেকে ১০ মিনিট পুরনো সব টেক্সট ফাইল পिछলা ডিরেক্টরিতে মুভ:
find . -name "*.txt" -mmin +10 | xargs -n1 -I '{}' mv '{}' ../
-I অপশন রিপ্লেস-স্ট্রিং ডিফাইন করে যা find-র আউটপুট থেকে পড়া নাম দিয়ে রিপ্লেস হয়। এখানে {}, কিন্তু যেকোনো কিছু হতে পারে (যেমন file)।
find . -name "*.txt" -mmin 10 | xargs -n1 -I 'file' mv 'file' ./practice
xargs কবে বন্ধ হবে সেটা বলানো
কারেন্ট ডিরেক্টরির সব .txt ফাইল ডিটেইল লিস্ট করতে চান। এক্সপ্লেইন করা মতো:
find . -name "*.txt" | xargs ls -l
সমস্যা: find .txt ফাইল না পেলেও xargs ls এক্সিকিউট করবে। উদাহরণ:
কোনো .txt ফাইল নাই, তবু xargs ls চালিয়ে দিয়েছে। এই বিহেভিয়ার চেঞ্জ করতে -r অপশন:
find . -name "*.txt" | xargs -r ls -l
উপসংহার
এখানে xargs + find ফোকাস করলাম, কিন্তু অন্যান্য কমান্ডের ওপরও ব্যবহার করা যায়। একাধিক কমপ্লেক্স কমান্ড এক্সিকিউট করতে হলে xargs খুব উপকারী টুল।
xargs কমান্ড পছন্দ হলে অন্যান্য লিনাক্স কন্টেন্ট দেখুন: No space left on device এরর ফিক্স বা উবুন্টু স্পিড আপ।