আমি স্ট্রিংযুক্ত সমস্ত ফাইল মুছতে চাই foo। লিনাক্সে ব্যাশ ব্যবহার করে আমি কীভাবে এটি করতে পারি?
foo(যেমন myfoo.jpg), অথবা ফাইল বাইট ক্রম ধারণ foo(যা বাইনারি ফাইল যা ঠিক তাই বাইটের যে ক্রম ধারণ ঘটতে অন্তর্ভুক্ত হতে পারে)?
আমি স্ট্রিংযুক্ত সমস্ত ফাইল মুছতে চাই foo। লিনাক্সে ব্যাশ ব্যবহার করে আমি কীভাবে এটি করতে পারি?
foo(যেমন myfoo.jpg), অথবা ফাইল বাইট ক্রম ধারণ foo(যা বাইনারি ফাইল যা ঠিক তাই বাইটের যে ক্রম ধারণ ঘটতে অন্তর্ভুক্ত হতে পারে)?
উত্তর:
এখানে একটি নিরাপদ উপায়:
grep -lrIZ foo . | xargs -0 rm -f --
-l অনুসন্ধানের ধরণটির সাথে মেলে এমন ফাইলগুলির ফাইলের নাম মুদ্রণ করে।-rfooপ্রদত্ত ডিরেক্টরিতে প্যাটার্নটির জন্য পুনরাবৃত্তি অনুসন্ধান করে .। যদি এটি কাজ না করে, চেষ্টা করুন -R।-I(মূলধন i) পিডিএফগুলির মতো বাইনারি ফাইলগুলি এড়িয়ে যায়।-Z ফাইলের নামগুলি শূন্য- (অর্থাত্ নুল-) সমাপ্ত হওয়া নিশ্চিত করে যাতে সাদা স্থানযুক্ত কোনও নাম ভুল উপায়ে ব্যাখ্যা করা যায় না (যেমন, একের পরিবর্তে একাধিক নাম হিসাবে)।xargs -0থেকে ফাইলের নাম ফিড grepথেকে rm -fশূন্য (nul) দ্বারা, পৃথক শব্দ বাইট (স্মরণ -Zথেকে বিকল্প grep)।--প্রায়শই ভুলে যাওয়া হয় তবে বিকল্পগুলির শেষটি চিহ্নিত করা এবং যাদের নাম দিয়ে শুরু হওয়া ফাইলগুলি অপসারণের অনুমতি দেওয়া খুব গুরুত্বপূর্ণ -।যদি আপনি দেখতে চান যে কোন ফাইলগুলি মুছতে চলেছে, কেবল সেই | xargs -0 rm -f --অংশটি সরিয়ে ফেলুন এবং Zবিকল্পটি ছেড়ে দিন grep।
অন্য ব্যবহারকারী নীচের মত কিছু প্রস্তাব করেছিলেন, যা আপনার চালানো উচিত নয় কারণ এটি অনিরাপদ:
files=`grep foo * | cut -d: -f1`
rm -f $files # unsafe, do not run it!
যদি আমার কাছে এমন ফাইল থাকে ImportantStuffযা আমি মুছতে এবং obsolete ImportantStuffধারণ করতে চাই না foo, তবে আমি এই কমান্ডটি চালানোর সময় আমি ImportantStuff(এবং না obsolete ImportantStuff !) হারাতে পারি, কারণ $filesএটি ব্যাখ্যা করার সাথে সাথে স্পেসে পৃথক হয়ে যায়। এইভাবে স্কেলার শেল ভেরিয়েবলের মধ্যে ফাইলের নামের তালিকা রাখা বিপজ্জনক।
$ find -type f -exec grep -q "foo" {} \; -exec echo rm -- {} \;
এটি পুনরুক্তিযুক্ত ফাইলগুলি অনুসন্ধান করে foo। দ্বিতীয়টি কেবল -execতখনই চালিত হয় যদি প্রথমটি execসফলভাবে প্রস্থান করে, অর্থাত্ grepম্যাচগুলি। আউটপুটটি echoসঠিক বলে মনে হলে শুকনো এবং মুছে ফেলুন ।
বা বিকল্পভাবে
$ find -type f -exec grep -q "foo" {} \; -print
এবং
$ find -type f -exec grep -q "foo" {} \; -delete
যেমনটি লেকেনস্টেইনের পরামর্শ অনুসারে।
find -type f -exec grep -q 'foo' {} \; -delete(চারপাশের উদ্ধৃতিগুলি {}অনর্থক, findফাইলগুলি মুছতেও সক্ষম is) নোট করুন যে grepএকটি নিয়মিত অভিব্যক্তি গ্রহণ করে। আপনি যদি অনুসন্ধান করতে চান তবে foo.barহয় এড়িয়ে যান বা -Fপ্যাটার্নটিকে আক্ষরিক হিসাবে বিবেচনা করার বিকল্পটি পাস করুন ।
-exec echo rm "{}" \;এবং না -delete?
-delete। এটি দ্বিতীয় সহ প্রদর্শিত -execএবং এটি প্রতিধ্বনি করা খুব সহজ ।
-print(বা -lsআরও ভার্বোসিটির জন্য) সহজ -exec echo rm "{}" \'। বাহ্যিক উপযোগের প্রয়োজন নেই।
আমি আদ্রিয়ান যা বলে তা করতাম,
তবে আমি শব্দটির সীমা যুক্ত করে দিয়েছি যাতে "খাবার" যুক্ত ফাইলগুলি দুর্ঘটনাবশত মুছে ফেলা না হয় (যদি না এটি খাবারের সাথে থাকা সমস্ত কিছু মুছে না দেয় তবে আপনি যা চান তা করতে হবে।)
$ find -type f -exec grep -q "\<foo\>" {} \; -delete
তীব্রভাবে, আমি মোছার আগে আউটপুটটিকে পুনর্নির্দেশ করব যাতে মুছে ফেলার আগে আমি পর্যালোচনা করতে পারি:
$ find -type f -exec grep -q "\<foo\>" > /tmp/list_of_files_to_delete