একটি বাদে সমস্ত উপ-ডিরেক্টরি মুছুন


10

ধরুন বর্তমান ডিরেক্টরিতে অধীনে একাধিক উপ-ডিরেক্টরি রয়েছে এবং একটিকে বলা হয় এ।

এ উইশ ব্যাশ ব্যতীত সমস্ত উপ-ডিরেক্টরি কীভাবে মুছবেন?

উত্তর:


23

বাশ গ্লোববিং প্রসারিত করেছেন (প্রথম পরীক্ষা, তারপরে প্রতিধ্বনিটি সরিয়ে দিন):

shopt -s extglob
echo rm -rf !(A)

(আগে আমি ভুলে - আপনি অক্ষম csh এর মূল শৈলী ইতিহাস সম্পূর্ণ করা, Bash3 সেখানে একটি বাগ যখন উপেক্ষা এর পারে (সেট + + এইচ।

+1 বাশ যদি আশ্চর্য পূর্ণ! কখনও কখনও তারা এই মত সুন্দর হয়।
— আলেকসান্দ্র লেভুকুক

বাহ সত্যিই খুব সুন্দর! আশানুরূপ কাজ করে। shopt | grep extপ্লাগ-ইন সক্ষম করা আছে কিনা তা দিয়ে আপনি দেখতে পারবেন।
— বিপদ 89


10

কি সম্পর্কে:

mv A /tmp/
rm * -rf
mv /tmp/A .

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


1
সরঞ্জামগুলি যথেষ্ট স্মার্ট হওয়ার পরিবর্তে বুদ্ধিমান কাজ করার জন্য +1 তবুও, এক রাতে, যখন আমি লিনাক্স শিখছিলাম, আমি আমার প্রথম পুনর্নির্মাণের আগে কর্নেলটি / tmp এ অনুলিপি করেছিলাম। এটি সফল হয়নি, তবে পুরানোটি মুছে ফেলেছে, তাই আমি বলেছিলাম 'ঘাম নেই, আমার একটি অনুলিপি রয়েছে' কেবল এটি দেখতে যে একটি মধ্যরাতের ক্রোন টাস্ক প্রতিটি ফাইলের সাথে / টিএমপি এক সপ্তাহেরও বেশি পুরানো মুছে ফেলেছিল! আমাকে আবার সংশোধন করতে হয়েছিল এবং এবার এটি সঠিকভাবে করা উচিত, না আমার জন্য কোনও রিবুট!
— জাভিয়ের

সেরা উত্তর পোস্ট করেছেন :)
— ওয়ারেন

3

কিছুটা এইরকম

find . -type d -not -name A -exec rm -ir {} \;

করা উচিত.

সম্পাদন করা

এটা সত্যই হওয়া উচিত

find . -type d -maxdepth 1 -not -name A -exec rm -ir {} \;

findএ এর নীচে পুনরাবৃত্তি থেকে রোধ করতে


3
তবে এটি এ / এফো এবং এ / বারের মতো নীচের যে কোনও উপ ডিরেক্টরিকে সরিয়ে ফেলবে তবে এ / এ সংরক্ষণ করবে।
— ক্যাম্পবেল

শান্ত! প্রশ্নোত্তর answert পেতে তাই থেকে সান ফ্রান্সিসকো চলে আসেন ... কিন্তু আমার সম্পাদন করা উপরে হারিয়ে গেছে ...
— agnul

ম্যাক্সডেপথ অদলবদল করা এবং এটির মতো আর্গুমেন্ট টাইপ করা ভাল find -maxdepth 1 -type d -not -name এ-এক্সেক আরএম -ir {} \;
— স্পোনারাইডার

1

আমি সাধারণত একটি এলএস কমান্ড কাজ করে এটি করি যা এটি প্রথমে পায়। আমি ইউনিক্স মেশিনে নেই, তবে এরকম কিছু:

ls -lda "[^ এ]"

এটি ঠিক হয়ে গেলে, কমান্ডে পাইপ করুন

ls -lda "[^ এ]" | | xargs rm -rf

আমার নিয়মিত প্রকাশটি যদি ভুল হয় তবে উপরে সম্পাদনা করতে দ্বিধা বোধ করবেন ...



1

আপনি যদি আরও নমনীয় হতে চান তবে ম্যানুয়াল করতে পারেন:

ls > /tmp/foo
edit /tmp/foo as you like
xargs -a /tmp/foo rm -r

এইভাবে আপনি সাধারণ মুগিং করতে পারেন।


1

এখানে একটি উপায়। এই ধরণের জিনিস সম্পর্কে সতর্ক থাকুন, যদিও এটি এতই শক্তিশালী যে এটি কেবল ভাল বা খারাপের জন্যই ব্যবহার করা যেতে পারে ...

* টাইপ ডি | grep -v "^ এ" | xargs rm -rf

1

কিছু লোকেরা যেমন-এক্সেক এবং আরএম দিয়ে-প্রিন্ট 0 ছাড়াই এবং এক্স-জার্গে -0 ছাড়াই দেখিয়েছেন তেমন ব্যবহারটি ব্যবহার করবেন না। এটি ফাঁকা স্থান বা নতুন লাইনের সাথে ফাইলের নামগুলিতে বিভ্রান্ত হবে:

$ mkdir 'foo foo'
$ mkdir foo$'\n'foo 
$ find . -type d -exec rm -ir {} \;
rm: cannot remove directory `.'
rm: remove directory `./foo\nfoo'? y
find: `./foo\nfoo': No such file or directory
rm: remove directory `./foo foo'? y
find: `./foo foo': No such file or directory

পরিবর্তে xargs -0, '-exec কমান্ড {} +' দিয়ে ফাইন্ড-প্রিন্ট 0 ব্যবহার করুন, বা যদি আপনার অনুসন্ধান সমর্থন করে তবে এটি মুছে ফেলুন।



1

এর আগের উদাহরণ ছাড়াও:

find -maxdepth 1 -type d -not -name A -not -name "." -exec rm -ir {} \;

আপনি এটি করতে পারেন:

find some/subdir -mindepth 1 -maxdepth 1 -type d -not -name A -exec rm -ir {} \;

cd some/subdirপ্রথম হওয়া এড়াতে ।

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