উত্তর:
এতে একটি বর্ধিত গ্লোববিং প্যাটার্ন ব্যবহার করুন bash
:
rm ./!(*999*)
এটি shopt -s extglob
সক্ষম করতে হবে (এবং সুরক্ষার জন্যও shopt -s failglob
, যাতে !(*999*)
সমস্ত ফাইলের নাম অন্তর্ভুক্ত থাকে তবে ভুল দ্বারা অস্বাভাবিক নামের কোনও ফাইল মুছে ফেলা হয় না 999
)। প্যাটার্নটি !(*999*)
বর্তমান ডিরেক্টরিতে যে কোনও নামের সাথে মিলে যাবে those নামগুলি মিলে *999*
। লুকানো ফাইলগুলি (ফাইলগুলির নাম যার সাথে একটি বিন্দু দিয়ে শুরু হয় ) মুছে ফেলার জন্য, dotglob
বিকল্পটি সক্ষম করুন ।
কেবল নিয়মিত ফাইলগুলি বা নিয়মিত ফাইলগুলির জন্য প্রতীকী লিঙ্কগুলি (ডিরেক্টরি নয় ইত্যাদি) যত্ন নেওয়ার জন্য:
for name in ./!(*999*); do [ -f "$name" ] && rm "$name"; done
zsh
উপরে লুপ করতে শেল সমতুল্য হবে
rm ./(^(*999*))(.)
আপনার প্রথম কমান্ড কাজ করবে না যেহেতু grep
ফাইলগুলির অভ্যন্তরীণ সন্ধান করবে। এটি সমস্ত ফাইলগুলিকে সরিয়ে ফেলবে যেগুলি বিনা লাইনগুলিতে রয়েছে 999
(আপনি যদি --null
বিকল্পটি যুক্ত করেন তবে এটি কাজ করে xargs -0
)।
আপনার দ্বিতীয় কমান্ড কাজ করবে না যেহেতু grep
ম্যাকওএসে সমর্থন করে না --null-data
(যদিও এটির --null
বিকল্প রয়েছে তবে কেবলমাত্র ফাইল নাম আউটপুট তৈরি করার জন্য)। এছাড়াও নোট করুন যে এটি কেবল ফাইলের নাম নয়, 999
ফাইলের পথে (ডিরেক্টরি উপাদানগুলি সহ) যে কোনও জায়গায় সন্ধান করবে ।
failglob
বিকল্পটি সক্ষম করতে চাইবেন বা !(*999*)
অন্য কোনও ফাইল নেই যার নাম না থাকলে কল করা ফাইলটি সরিয়ে ফেলতে পারে 999
।
নামের শর্তটি কেবল এতে উল্টে দিন find
:
find . -type f \! -name "*999*"
যোগ -delete
বা -exec rm {} +
আসলে মিলেছে ফাইল মুছে ফেলুন করতে।
!
নিরাপদ bash
।
grep -l
ফাইল যেখানে একটি ম্যাচ পাওয়া যায়নি (অথবা সঙ্গে পাওয়া তালিকায় ঘটায়-v
মধ্যে) বিষয়বস্তু না ফাইলের নাম।grep
আপনার নির্দিষ্ট করা ফাইলগুলির সামগ্রীর সাথে সর্বদা মেলে, তাদের নাম কখনও নয়।