উত্তর:
এতে একটি বর্ধিত গ্লোববিং প্যাটার্ন ব্যবহার করুন 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আপনার নির্দিষ্ট করা ফাইলগুলির সামগ্রীর সাথে সর্বদা মেলে, তাদের নাম কখনও নয়।