একটি নির্দিষ্ট প্যাটার্নের সাথে মেলে এমনগুলি বাদ দিয়ে একটি ডিরেক্টরিতে সমস্ত ফাইল / ফোল্ডার মুছে ফেলার কাজটি সম্প্রতি আমার মুখোমুখি হয়েছিল। কাজটি করার জন্য আমি একটি একক-লাইন ইউনিক্স কমান্ড রান্না করেছি। এটি কি এক লাইন হওয়া উচিত? আমি মনে করি না, তবে এটি অবশ্যই শীতল!
সমস্যাটি বেশ সহজ হলেও আমার সমাধানটি কতটা জটিল হয়েছিল তা নিয়ে আমি একটু অবাক হয়েছিলাম। আমি যে আদেশটি ব্যবহার করেছি তা এখানে; দ্রষ্টব্য: এটি একটি দুর্বল সমাধান কারণ এটি লাইন-ফিড অক্ষরযুক্ত ফাইলের নামগুলি হ্যান্ডেল করে না (যা আমার পরিস্থিতিতে গুরুত্বপূর্ণ নয়)।
ls | grep -v PATTERN | xargs -n1 -IREPLACE rm -rf REPLACE
আমি "ফাইন্ড" কমান্ডটি ব্যবহার করিনি কারণ আমি প্যাটার্নের সাথে মেলে ফোল্ডারে পুনরাবৃত্তি করতে চাই না। উদাহরণস্বরূপ, নিম্নলিখিত ফাইল গঠন বিবেচনা করুন:
file_foo.txt
first_dir
|
+--> contents
+--> ...
foo_dir
|
+--> anotherfile.txt
+--> morefiles.log
foo_file.txt
somefile.txt
প্যাটার্ন "foo বিন্যাস" ব্যবহার কেবল "first_dir" (এবং এটি এর কোর্স বিষয়বস্তু) এবং "somefile.txt" (সরাতে হবে না "anotherfile.txt" বা "morefiles.log")।
প্রশ্ন, এটি সম্পাদন করার জন্য আরও ভাল (আরও মার্জিত এবং সঠিক) উপায় আছে?
সম্পাদনা:
এটি সম্প্রতি আমার নজরে এনেছিল যে "সন্ধান" আরও ভাল বিকল্প হতে পারে :
find * -maxdepth 0 ! -name PATTERN -print0 | xargs -0n1 rm -rf
এই সমাধানটি লাইন-ফিডের অক্ষরগুলি সহ সঠিকভাবে পরিচালনা করে।