"টেস্ট" নামের সমস্ত ডিরেক্টরি লিনাক্সে সন্ধান করুন এবং মুছুন


35

আমার কাছে "টেস্ট" নামে অনেক ডিরেক্টরি রয়েছে এবং আমি সেগুলি মুছতে চাই।

আমি কীভাবে তাদের সন্ধান করতে এবং সেগুলি ব্যবহার করে মুদ্রণ করতে জানি:

find . -name test -print

এখন, আমি কীভাবে ডিরেক্টরিগুলি সরিয়ে ফেলব?


দয়া করে নোট করুন যে আমার কাছে ডিরেক্টরিতে ফাইল রয়েছে এবং সেগুলি অবশ্যই মুছে ফেলা উচিত।

উত্তর:


70

xargs সমস্ত যাদু আছে:

find . -name test -type d -print0|xargs -0 rm -r --

xargs স্ট্যান্ডিনে আর্গুমেন্ট প্রেরণ করে প্যারামিটার হিসাবে প্রদত্ত কমান্ডটি কার্যকর করে।

এটি rm -rডিরেক্টরি এবং তার সমস্ত শিশু মুছতে ব্যবহার করছে।

--আর্গুমেন্ট শেষ উল্লেখ করে, একটি পাথ দিয়ে শুরু এড়াতে -একটি আর্গুমেন্ট হিসাবে গণ্য হওয়া থেকে।

-print0নিউলাইনগুলির পরিবর্তে অক্ষরগুলি findমুদ্রণ করতে বলে \0; এবং কেবল যুক্তি বিভাজক হিসাবে আচরণ করতে -0বলে ।xargs\0

এটি প্রতিটি ডিরেক্টরিতে পৃথকভাবে rmকল করার ওভারহেড এড়িয়ে একবারে অনেকগুলি ডিরেক্টরি সহ কল ​​করে rm


বিকল্প হিসাবে, findপ্রতিটি নির্বাচিত ফাইলের জন্য একটি কমান্ডও চালাতে পারে :

find . -name test -type d -exec rm -r {} \;

এটি আরও ভাল পারফরম্যান্স সহ, যেহেতু এটি একবারে একাধিক ডিরেক্টরিrm সহ কল করবে :

find . -name test -type d -exec rm -r {} +

( +শেষের দিকে নোট করুন ; এটি xargsসমাধানের সমান ))


1
চমৎকার উত্তর, বিশেষ করে +খুঁজুন। আমার কোনও ধারণা ছিল না, অবশ্যই আশা করি আমি এটি অনেক আগে জানতাম।
স্কট

শেষ কমান্ডটি সন্ধান করুন, এটি কোনও কোনও ফাইল মুছে ফেলে। xargsকমান্ড ভাল কাজ করেন।
হেনরিক ডি সোসা

23
find /path/to/dir -name "test" -type d -delete
  • -নাম: পাস করা নামটির সন্ধান করে। আপনি -regexনিয়মিত প্রকাশের উপর ভিত্তি করে নাম সরবরাহের জন্য ব্যবহার করতে পারেন

  • -প্রকার: ফাইল প্রকারের জন্য সন্ধান করে। dকেবল ডিরেক্টরি অনুসন্ধান করে

  • -সিলিট: ক্রিয়া যা পাওয়া তালিকা মুছে দেয়।

বিকল্পভাবে:

find /path/to/dir -name "test" -type d -exec rm -rf {} \;

হিসাবে জেএফ সেবাস্টিয়ান মন্তব্য বলেন:

আপনি একবারে একাধিক ডিরেক্টরি পাস করার +পরিবর্তে ব্যবহার করতে পারেন \;


1
দুঃখিত, আমি উল্লেখ করতে ভুলে গেছি যে এই ডিরেক্টরিগুলিতে ফাইল থাকতে পারে। "সন্ধান করুন: /। / স্টার্ট 'মুছতে পারে না: ত্রুটি
আবর্জনা সংগ্রহ

@garbagecollection আমি একটি আপডেট যুক্ত করেছি।
জয়পাল সিং

3
আপনি একবারে একাধিক ডিরেক্টরি পাস করার +পরিবর্তে ব্যবহার করতে পারেন \;
jfs

ধন্যবাদ @ জেএফএসবেস্তিয়ান ভাল পয়েন্ট। আমি এটি উত্তরে যুক্ত করব।
জয়পাল সিংহ


5

আপনি এক্সেক্স বিকল্পটিও ব্যবহার করতে পারেন

find . -name test -exec rm {} \;

3

ধরে নেওয়া বাশ 4+

shopt -s globstar
rm -r ./**/test/

পেছনের স্ল্যাশটির অর্থ এটি কেবল ডিরেক্টরিগুলির সাথে মিলবে। পরীক্ষাটি এর আগেই রয়েছে:

printf '%s\n' ./**/test/

2

ধরে নিন আপনি gnu ফাইন্ড ব্যবহার করছেন, আপনি-ডিলিট বিকল্পটি ব্যবহার করতে পারেন:

find . -name test -delete

যা মনে রাখা সহজ।


2

অন্য উত্তরটি নির্দেশ করে, আপনি নামের সাথে সমস্ত ডিরেক্টরি সন্ধানের চেষ্টা করতে পারেন testএবং সেগুলি মুছতে পারেন

find -name "test" -type d -delete

আমি ম্যাকের সাথে ক্রস সামঞ্জস্যের কিছু সমস্যা নিয়ে ছুটে এসেছি, সুতরাং আমি এই সমতুল্য আদেশটি ব্যবহার করেছি:

find -path "*/test" -type d -delete
  • -পথ : পুরোপুরি যোগ্যতাসম্পন্ন ফাইলনামে একটি প্যাটার্ন সন্ধান করে।

তবে উভয় ক্ষেত্রেই, যদি নামের কোনও ডিরেক্টরিতে testফাইল থাকে, findতবে এটি অভিযোগ করবেDirectory is not empty করবে এবং ডিরেক্টরিটি সরাতে ব্যর্থ হবে।

আপনি যদি ডিরেক্টরি সহ সমস্ত ফাইল মুছতে চানtest , তবে আমরা testপ্রথমে নামের ডিরেক্টরিগুলির মধ্যে থাকা সমস্ত ফাইল মুছতে একই কৌশলটি ব্যবহার করতে পারি ।

find -path "*/test/*" -delete

প্যাটার্ন:, "*/test/*"নিশ্চিত করবে যে আমরা কেবল নামের নামের একটি ডিরেক্টরিতে ফাইল মুছব /test/। ডিরেক্টরিগুলি খালি হয়ে গেলে, আমরা প্রথম কমান্ডটি ব্যবহার করে ডিরেক্টরিগুলি মুছতে পারি:

find -path "*/test" -type d -delete

উদাহরণ:

$ tree
.
├── mytest
│   └── test
│       └── blah.txt
├── test
│   ├── bar.jpg
│   └── dir
│       └── bar.bak
└── testdir
    └── baz.c

5 directories, 4 files

$ find -path "*/test" -type d -delete
$ tree
.
├── mytest
│   └── test
├── test
└── testdir
    └── baz.c

4 directories, 1 file

$ find -name "test" -type d -delete
$ tree
.
├── mytest
└── testdir
    └── baz.c

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