লিনাক্সে ব্যাশে একবারে একাধিক ফাইল মুছবেন কীভাবে?


103

আমার কাছে লিনাক্স সার্ভারে এই ফাইলগুলির তালিকা রয়েছে:

abc.log.2012-03-14
abc.log.2012-03-27
abc.log.2012-03-28
abc.log.2012-03-29
abc.log.2012-03-30
abc.log.2012-04-02
abc.log.2012-04-04
abc.log.2012-04-05
abc.log.2012-04-09
abc.log.2012-04-10

আমি rm -rfনীচের দেখুন কমান্ডটি ব্যবহার করে নির্বাচিত লগ ফাইলগুলি একে একে মুছে ফেলছি :

rm -rf abc.log.2012-03-14
rm -rf abc.log.2012-03-27
rm -rf abc.log.2012-03-28

অন্য উপায় আছে, যাতে আমি একবারে নির্বাচিত ফাইলগুলি মুছতে পারি?


4
এবং "জিএনইউ / লিনাক্স বলুন, কেবল লিনাক্স নয়", আমি পিছনের সিট থেকে সোমোন বজ্রপাত শুনতে পাচ্ছি।
বরিস স্ট্যাটনিকি

8
যাইহোক, কেন -আরএফ? এই ফোল্ডারগুলি হয়? f জোর করা, r পুনরাবৃত্তির জন্য। এটি যদি কেবল একটি ফাইল হয় তবে তা কাজ করবে তবে সতর্ক করা হবে, প্রতিবার আপনি কোনও কিছু মুছতে চাইলে খুব (খুব) (খুব খুব) বিপজ্জনক। (এবং আপনার "বাশ" ট্যাগটি যুক্ত করা উচিত কারণ "লিনাক্স" খুব চওড়া
ডিপ্যাডো

@ বরিসস্টিটনিক - আমি কেন আগ্রহী তা সম্পর্কে আগ্রহী GNU?
ব্যবহারকারী 66001

2
@ ব্যবহারকারী 66001: জিএনইউ প্রকল্পের মতামত সম্পর্কে: gnu.org/gnu/linux-and-gnu.html । আমি অন্তত এখানে নেই এ বিষয়ে কোন অবস্থান গ্রহণ, এবং এই হল না এটা বিতর্ক জায়গা।
কিথ থম্পসন

2
@ বোরিসস্টিটনিকি - বিতর্ক করার দরকার নেই, সম্পূর্ণ নিখুঁত ছিল এবং এই লিঙ্কটি আমাকে +1
ইউজার 66001

উত্তর:


159

বাশ সব ধরণের ওয়াইল্ডকার্ড এবং বিস্তৃতিকে সমর্থন করে।

আপনার সঠিক কেসটি ব্রেস প্রসার দ্বারা পরিচালনা করা হবে , যেমন:

$ rm -rf abc.log.2012-03-{14,27,28}

উপরে হবে প্রসারিত তিনটি আর্গুমেন্ট সঙ্গে একটি একক কমান্ড এবং টাইপ সমতুল্য হতে:

$ rm -rf abc.log.2012-03-14 abc.log.2012-03-27 abc.log.2012-03-28

এটি উল্লেখ করা গুরুত্বপূর্ণ যে এই প্রসারণটি শেল দ্বারা সম্পন্ন হয়েছে, rmএমনকি এমনকি লোড হওয়ার আগে ।


আপনি যদি ভবিষ্যতে ফাইলগুলি পুনরুদ্ধার করতে চান তবে "আরএম" ব্যবহার করবেন না You
ভাট

75

*একাধিক ফাইল মেলানোর জন্য একটি ওয়াইল্ডকার্ড ( ) ব্যবহার করুন ।

উদাহরণস্বরূপ, নীচের কমান্ডটি শুরু হওয়া নামের সাথে সমস্ত ফাইল মুছবে abc.log.2012-03-

rm -f abc.log.2012-03-*

আমি ls abc.log.2012-03-*ফাইলগুলির তালিকা তৈরির জন্য দৌড়ে সুপারিশ করব যাতে rmকমান্ডটি চালানোর আগে আপনি কী মুছতে চলেছেন তা দেখতে পান ।

আরও তথ্যের জন্য ফাইল নাম প্রসারণে বাশ ম্যান পৃষ্ঠাটি দেখুন ।


খুব দরকারী, তবে এটি মোছার জন্য নিশ্চিতকরণের জন্য জিজ্ঞাসা করছে না। সাবধান হোন.
নুরিসেলকুক

1
প্রতিটি ফাইল মোছার জন্য নিশ্চিতকরণ পেতে আপনি @iুরিসেলকুক যোগ করতে পারেন।
ফিলিপ রোমেরো

অ্যামাজন লিনাক্স 1 চলমান এডাব্লুএস ইসি 2-ইনস্ট্যান্সে মনোযোগের মতো কাজ করেছে :) আপনাকে ধন্যবাদ।
কাইল ব্রিজেনস্টাইন

41

যদি আপনি সমস্ত ফাইল মুছতে চান যাদের নাম একটি নির্দিষ্ট ফর্মের সাথে মেলে তবে একটি ওয়াইল্ডকার্ড (গ্লোব প্যাটার্ন) সবচেয়ে সরল সমাধান। কিছু উদাহরণ:

$ rm -f abc.log.*             # Remove them all
$ rm -f abc.log.2012*         # Remove all logs from 2012
$ rm -f abc.log.2012-0[123]*  # Remove all files from the first quarter of 2012

নিয়মিত প্রকাশগুলি ওয়াইল্ডকার্ডের চেয়ে বেশি শক্তিশালী; আপনি আউটপুট ভোজন পারেন grepকরতে rm -f। উদাহরণস্বরূপ, যদি ফাইলের নাম কিছু দিয়ে শুরু "abc.log"এবং সঙ্গে কিছু "ABC.log", grepদেয় একটি কেস-অবশ ম্যাচ করুন:

$ rm -f $(ls | grep -i '^abc\.log\.')

যদি ফাইলের নামের কোনওটিতে ফাঁকা স্থান সহ মজাদার অক্ষর থাকে তবে এটি সমস্যা তৈরি করবে। সতর্ক হোন.

যখন আমি এটি করি, আমি ls | grep ...প্রথমে কমান্ডটি চালাচ্ছি এবং এটি আমার আউটপুটটি উত্পাদন করে তা পরীক্ষা করে দেখুন - বিশেষত যদি আমি ব্যবহার করি rm -f:

$ ls | grep -i '^abc\.log\.'
(check that the list is correct)
$ rm -f $(!!)

যেখানে !!পূর্ববর্তী কমান্ডে প্রসারিত হয়। অথবা আমি আপ-তীর বা Ctrl-P টাইপ করতে পারি এবং rm -fকমান্ড যুক্ত করতে পূর্ববর্তী লাইনটি সম্পাদনা করতে পারি ।

এটি ধরে নিয়েছে আপনি ব্যাশ শেলটি ব্যবহার করছেন। কিছু অন্যান্য শেল, বিশেষত csh এবং tcsh এবং কিছু পুরানো sh-derised শেল $(...)সিনট্যাক্স সমর্থন করে না । আপনি সমতুল্য ব্যাকটিক সিনট্যাক্স ব্যবহার করতে পারেন:

$ rm -f `ls | grep -i '^abc\.log\.'`

$(...)সিনট্যাক্স পড়ার জন্য সহজ, এবং যদি সত্যিই উচ্চাভিলাষী করছি এটা নেস্টেড হতে পারে।

অবশেষে, আপনি মুছে ফেলতে চান ফাইলগুলির সাবসেটটি যদি নিয়মিত অভিব্যক্তি দিয়ে সহজেই প্রকাশ করা যায় না, আমি যে কৌশলটি প্রায়শই ব্যবহার করি তা হ'ল ফাইলগুলি একটি অস্থায়ী পাঠ্য ফাইলটিতে তালিকাভুক্ত করা, তারপরে এটি সম্পাদনা করুন:

$ ls > list
$ vi list   # Use your favorite text editor

আমি listকেবল ফাইলগুলি সরাতে চাইলে নিজেই ফাইল সম্পাদনা করতে পারি এবং তারপরে:

$ rm -f $(<list)

অথবা

$ rm -f `cat list`

(আবার, এটি ধরে নেয় যে কোনও ফাইলের নামেই মজাদার অক্ষর নেই, বিশেষত স্পেস।

বা, listফাইল সম্পাদনা করার সময় , আমি rm -f প্রতিটি লাইনের শুরুতে এবং তারপরে যোগ করতে পারি :

$ . ./list

অথবা

$ source ./list

ফাইল সম্পাদনা করা যেখানে প্রয়োজন সেখানে উদ্ধৃতি যুক্ত করারও একটি সুযোগ, উদাহরণস্বরূপ পরিবর্তন rm -f foo barকরা rm -f 'foo bar'


8

সমস্ত ফাইলকে একক লাইনে একত্রিত করতে প্রতিটি ফাইলের নামের মধ্যে একটি স্থান যুক্ত করুন এবং তারপরে rmতালিকার শুরুতে যুক্ত করতে কেবল মহাকর্ষে মাল্টলাইন নির্বাচন ব্যবহার করুন । আপনি মুছতে চান এমন ফাইলের নামগুলিতে কোনও প্যাটার্ন না থাকলে এটি বেশিরভাগ ক্ষেত্রে কার্যকর।

[$]> rm abc.log.2012-03-14 abc.log.2012-03-27 abc.log.2012-03-28 abc.log.2012-03-29 abc.log.2012-03-30 abc.log.2012-04-02 abc.log.2012-04-04 abc.log.2012-04-05 abc.log.2012-04-09 abc.log.2012-04-10

এটি গ্রহণযোগ্য উত্তর হওয়া উচিত কারণ এটি স্পষ্টভাবে উত্থাপিত প্রশ্নের উত্তর দেয়। গুগল থেকে এখানে আসা লোকদের কাছে এটি আরও বন্ধুত্বপূর্ণ।
এটিলিফ

5

একটি ওয়াইল্ড কার্ড এর জন্য খুব সুন্দরভাবে কাজ করবে, যদিও নিরাপদ থাকার জন্য ওয়াইল্ড কার্ডের ব্যবহার যতটা সম্ভব ন্যূনতম করা ভাল, তাই এর লাইন বরাবর কিছু:

rm -rf abc.log.2012-*

যদিও এর চেহারা থেকে, সেগুলি কি কেবল একক ফাইল? Those আইটেমগুলির মধ্যে কোনও ডিরেক্টরি না হলে পুনরাবৃত্তির বিকল্পটি প্রয়োজন হবে না, তাই কেবল সুরক্ষার জন্য এটি ব্যবহার না করা ভাল।


2

আমি কোনও লিনাক্স গুরু নই, তবে আমি বিশ্বাস করি যে আপনি নিজের আউটপুট ফাইলগুলির তালিকাটি পাইপ করতে চান xargs rm -rf। আমি এর আগে কিছু ভাল ফলাফল দিয়ে ব্যবহার করেছি with প্রথমে একটি নমুনা ডিরেক্টরি পরীক্ষা!

সম্পাদনা করুন - প্রদর্শিত অন্যান্য উত্তরগুলির ভিত্তিতে আমার ভুল ধারণা থাকতে পারে। আপনি যদি ওয়াইল্ডকার্ড ব্যবহার করতে পারেন তবে দুর্দান্ত। আমি ধরে নিয়েছি যে আপনি প্রদর্শিত আপনার মূল তালিকাটি আপনার "নির্বাচন" দেওয়ার জন্য একটি প্রোগ্রাম দ্বারা উত্পাদিত হয়েছে, তাই আমি পাইপিংয়ের পথটি xargsহবে বলে ভেবেছিলাম ।


-1

আপনি যদি একবারে ডিরেক্টরিতে অন্তর্ভুক্ত সমস্ত ফাইল মুছতে চান তবে। উদাহরণস্বরূপ: আপনার ডিরেক্টরিটির নাম "লগ" এবং "লগ" ডিরেক্টরিতে abc.log.2012-03-14, abc.log.2012-03-15, ... ইত্যাদি ফাইল অন্তর্ভুক্ত রয়েছে। আপনাকে লগ ডিরেক্টরিতে উপরে থাকতে হবে এবং:

rm -rf /log/*
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.