এক এবং তার বংশধরদের বাদে পিতামাতার ডিরেক্টরি থেকে সমস্ত ডিরেক্টরি সরান


8

ডিরেক্টরি কাঠামো

আমি ডিরেক্টরি বি এবং ডি মুছে ফেলতে চাই তবে আমি সি এবং এর সমস্ত বংশধর ফাইল এবং ডিরেক্টরি রাখতে চাই। একটি ডিরেক্টরি এবং তার শিশুদের ব্যতীত পিতামাতৃত ডিরেক্টরিগুলির সমস্ত শিশু ডিরেক্টরি মুছে ফেলার জন্য আদেশ কী।

সাহায্য প্রশংসা।


আপনি যে ডিরেক্টরিগুলি খালি অপসারণ করতে চান তা কি?
বয়স্ক গীক


প্যারেন্ট ডিরেক্টরিতে সরাসরি অবস্থিত ফাইলগুলি সম্পর্কে কী ( Aআপনার উদাহরণে)? এগুলিও মুছবেন নাকি রাখবেন?
বাইট কমান্ডার

বাইট কমান্ডার যা জিজ্ঞেস করছে তা হ'ল, এ-তে কোনও ফাইল আছে? বা শুধুমাত্র ডিরেক্টরি? আপনি কি এগুলিতে নিয়মিত ফাইলগুলি সরানো বা কেবল ডিরেক্টরিগুলি চান?
সের্গেই কোলোডিয়াজনি

উত্তর:


6

আপনি যা চান তা হ'ল এই আদেশটি:

find ~/TESTDIR -mindepth 1 -maxdepth 1 -type d -not \( -name "keepMe" \) -exec rm -rf {} \;

ডেমো:

# List what's inside directory we want to remove
$ ls
file1  file2  keepMe/  removeA/  removeB/
# Testing what find gives without removing
$ find ~/TESTDIR -mindepth 1 -type d -not \( -name "keepMe" \)               
/home/xieerqi/TESTDIR/removeA
/home/xieerqi/TESTDIR/removeB
# Actual removal and testls
$ find ~/TESTDIR -mindepth 1 -maxdepth 1 -type d -not \( -name "keepMe" \) -exec rm -rf {} \;
$ ls
file1  file2  keepMe/

ব্যাখ্যা:

  • find DIRECTORY DIRECTORY এ পরিচালনা করার জন্য কল সন্ধান কমান্ড
  • -mindepth 1 : কেবল ডিরেক্টরি সামগ্রীতে কাজ করুন, ডিরেক্টরি নিজেই এড়ানো যা স্তর 0
  • -maxdepth 1: উপ-ডিরেক্টরিতে নামতে বাধা দেয় ( rm -rfযাইহোক পুনরাবৃত্ত হয়, সুতরাং সেগুলি সরাতে আমাদের উপ- ডিরেক্টরিতে নামার দরকার নেই)
  • -type d : শুধুমাত্র ডিরেক্টরি অনুসন্ধান করুন
  • -not \( -name "keepMe" \) আপনি যে নামটি রাখতে চান তাতে আইটেমটি উপেক্ষা করুন
  • -exec rm -rf {} \; প্রতিটি পাওয়া আইটেম অপসারণ সঞ্চালন

দুর্দান্ত ব্যাখ্যা। যদিও আমার জন্য অনেকগুলি কিস্ট্রোক রয়েছে ...
বয়স্ক গীত

1
findএখানে ভাল বন্ধু, তবে বাশের forএবং testআরও ভাল বন্ধু ...>: - ডি
বাইট কমান্ডার

8

দেওয়া বাশ শেলের প্রসারিত গ্লোব বৈশিষ্ট্যগুলি (যা বর্তমান উবুন্টু ইনস্টলেশনগুলিতে ডিফল্টরূপে সক্ষম হয়) দেওয়া আছে

$ tree A
A
├── B
├── C
│   ├── ac1
│   └── ac2
└── D

5 directories, 0 files

আপনি Cগ্লোব এক্সপ্রেশন A/!(C)অর্থাত্ ব্যবহার করে বাদে এবং এর বিষয়বস্তুগুলিকে সম্বোধন করতে পারেন

$ echo A/!(C)
A/B A/D

সুতরাং ডিরেক্টরি এবং এর সামগ্রীগুলি বাদ দিয়ে সবকিছু সরিয়ে ফেলতেC আপনি কেবল ব্যবহার করতে পারেন

rm -rf A/!(C)

ছোড়

$ tree A
A
└── C
    ├── ac1
    └── ac2

3 directories, 0 files

এই বৈশিষ্ট্য সম্পর্কে জানতে অবাক করা। আমি ssh করার পরে এবং ম্যানুয়ালি চালানোর পরে এটি দুর্দান্ত কাজ করে তবে আমি b "-বাশ: লাইন 1: অপ্রত্যাশিত টোকেনের কাছে সিনট্যাক্স ত্রুটিটি ('"যখন আমি এটি দূরবর্তী মাধ্যমে চালিত করি ssh $VM_ADDRESS "rm -rf $APP_FOLDER/!(node_modules)"Any কোনও ধারণা? অনেক ধন্যবাদ
রেনাটো গামা

@ রেনাটোয়ার extglobশেল বিকল্পটি কেবল ইন্টারেক্টিভ শেলগুলির জন্যই সক্ষম - আপনি sshযে এটি করতে বাধ্য করতে পারবেন তা নিশ্চিত নয়
স্টিল্ড্রাইভার

5

একটি সহজ উপায় হ'ল ট্র্যাশ-ক্লিপ ব্যবহার করা

আপনি এটি দিয়ে ইনস্টল করতে পারেন sudo apt-get install trash-cli

একবার ইনস্টল হয়ে গেলে আপনি মূল ডিরেক্টরি এ-তে নেভিগেট করতে পারেন cd /Aএবং তারপরে trash B Dবি এবং ডি ডিরেক্টরিগুলি মুছে ফেলতে চান যেখানে কমান্ডটি প্রেরণ করতে পারেন (তারা যে ড্রাইভটি চালাচ্ছেন তার ট্র্যাশ বিনে শেষ হবে তাই আপনি যদি ভুল করতে পারেন তবে ফাইলগুলি পুনরুদ্ধার করুন)

উবুন্টু 16.04 এবং 14.04 এর অধীনে পরীক্ষিত


এ জাতীয় কিছু দিয়ে কি সরল করা যায় trash ! C?
সের্গেই কলডিয়াজনি

@ সার্জ নোপ trash: cannot trash non existent ! '`
বয়স্ক

@ সার্জ এবং সি ট্র্যাশ হয়ে গেছে ...
বয়স্ক

এটি খুঁজে পেয়েছে : stackoverflow.com/q/216995/3701431 এটি সক্রিয় করা প্রয়োজন extglob
সের্গেই কোলোডিয়াজনি

@ সার্গ হাতে থাকা কাজের উপর নির্ভর করে যা বেশ কার্যকর হতে পারে! ;-)
প্রবীণ গীক

4

কেবল বাশের forলুপটি ব্যবহার করুন এবং testপছন্দসই ডিরেক্টরিগুলি ফিল্টার করতে এবং rm -rfকমান্ডটি পুনরাবৃত্তভাবে ডিরেক্টরিগুলি মুছতে, যেমন:

for x in /path/to/parent/*; do test "$x" != "dir_survive" && rm -rf "$x"; done

এটি অভ্যন্তরের সমস্ত উপাদান (ফাইল এবং ডিরেক্টরি) এর উপরে পুনরাবৃত্তি করে এবং /path/to/parent/নামটির সাথে সমান না হলে পুনরাবৃত্তভাবে উপাদানটিকে মুছে দেয় dir_survive। যদি মূল ডিরেক্টরি বর্তমান ডিরেক্টরি হয় তবে আপনি কেবল *পথ হিসাবেই লিখতে পারেন ।

আপনি যদি অনিশ্চিত থাকেন এবং কোন পদক্ষেপ না নিয়ে কোন উপাদানগুলি প্রথমে মুছে ফেলা হবে তা পরীক্ষা করতে চান তবে rm -rfউপরের কমান্ডটিতে কেবল প্রতিস্থাপন করুন echoএবং এটি কেবল মোছা প্রার্থীদের আউটপুট দেবে।

এখানে একটি উদাহরণ রান করুন:

$ tree
.
├── dir1
│   ├── subdir1
│   │   ├── file1
│   │   └── file2
│   └── subdir2
│       ├── file1
│       └── file2
├── dir2
│   ├── subdir1
│   │   ├── file1
│   │   └── file2
│   └── subdir2
│       ├── file1
│       └── file2
└── dir_survive
    ├── subdir1
    │   ├── file1
    │   └── file2
    └── subdir2
        ├── file1
        └── file2

9 directories, 12 files

$ for x in *; do test "$x" != "dir_survive" && rm -rf "$x"; done

$ tree
.
└── dir_survive
    ├── subdir1
    │   ├── file1
    │   └── file2
    └── subdir2
        ├── file1
        └── file2

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