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


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.