লিনাক্সে, আমি কীভাবে এমন সমস্ত ফাইল খুঁজে পাব যাতে স্ট্রিং রয়েছে এবং সেগুলি মুছতে পারে?


17

আমি স্ট্রিংযুক্ত সমস্ত ফাইল মুছতে চাই foo। লিনাক্সে ব্যাশ ব্যবহার করে আমি কীভাবে এটি করতে পারি?


স্ট্রিং এর ফাইল নাম?
rdd

3
পরিষ্কার করে বলো: যদি ডিলিট ফাইল যার চাও নাম ধারণ করে foo(যেমন myfoo.jpg), অথবা ফাইল বাইট ক্রম ধারণ foo(যা বাইনারি ফাইল যা ঠিক তাই বাইটের যে ক্রম ধারণ ঘটতে অন্তর্ভুক্ত হতে পারে)?
হামার

উত্তর:


33

এখানে একটি নিরাপদ উপায়:

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এটি ব্যাখ্যা করার সাথে সাথে স্পেসে পৃথক হয়ে যায়। এইভাবে স্কেলার শেল ভেরিয়েবলের মধ্যে ফাইলের নামের তালিকা রাখা বিপজ্জনক।


17
$ 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

যেমনটি লেকেনস্টেইনের পরামর্শ অনুসারে।


4
... যা এটিকে সংক্ষিপ্ত করা যেতে পারে: find -type f -exec grep -q 'foo' {} \; -delete(চারপাশের উদ্ধৃতিগুলি {}অনর্থক, findফাইলগুলি মুছতেও সক্ষম is) নোট করুন যে grepএকটি নিয়মিত অভিব্যক্তি গ্রহণ করে। আপনি যদি অনুসন্ধান করতে চান তবে foo.barহয় এড়িয়ে যান বা -Fপ্যাটার্নটিকে আক্ষরিক হিসাবে বিবেচনা করার বিকল্পটি পাস করুন ।
লেকেনস্টেইন

কোন কারণ ব্যবহার -exec echo rm "{}" \;এবং না -delete?
বার্টেক করুন

1
@ ভার্টেক না, আমি ব্যবহার করব -delete। এটি দ্বিতীয় সহ প্রদর্শিত -execএবং এটি প্রতিধ্বনি করা খুব সহজ ।
অ্যাড্রিয়ান ফ্রেহওয়ার্থ

1
এর চেয়ে টাইপ করা -print(বা -lsআরও ভার্বোসিটির জন্য) সহজ -exec echo rm "{}" \'। বাহ্যিক উপযোগের প্রয়োজন নেই।
লেকেনস্টেইন

1
আপনি যদি rm {} ব্যবহার করেন, rm - {} ব্যবহার করুন, যাতে ফাইলের নামের কোনও বিশেষ অক্ষর নিজেই ইন্টারপোল্ট না হয়। উদাহরণস্বরূপ, যে কোনও ডিরেক্টরিতে আপনার লেখার অনুমতি রয়েছে সেখানে '-rf /' টাচ করুন ...
atk

1

আমি আদ্রিয়ান যা বলে তা করতাম,

তবে আমি শব্দটির সীমা যুক্ত করে দিয়েছি যাতে "খাবার" যুক্ত ফাইলগুলি দুর্ঘটনাবশত মুছে ফেলা না হয় (যদি না এটি খাবারের সাথে থাকা সমস্ত কিছু মুছে না দেয় তবে আপনি যা চান তা করতে হবে।)

 $ find -type f -exec grep -q "\<foo\>" {} \; -delete

তীব্রভাবে, আমি মোছার আগে আউটপুটটিকে পুনর্নির্দেশ করব যাতে মুছে ফেলার আগে আমি পর্যালোচনা করতে পারি:

 $ find -type f -exec grep -q "\<foo\>" > /tmp/list_of_files_to_delete

যত তাড়াতাড়ি আপনি মন্তব্য পোস্ট করতে সক্ষম হবেন, আপনার মত মন্তব্যগুলি পোস্ট করা উচিত।
এফএসম্যাক্সবি

হ্যাঁ আমি প্রথমে চেষ্টা করেছিলাম কিন্তু তখন বুঝতে পেরেছিলাম যে আমাকে এখনও মন্তব্য পোস্ট করার অনুমতি নেই।
পিটার এইচ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.