খালি ডিরেক্টরি গাছগুলি মুছুন (যতগুলি সম্ভব ডিরেক্টরিকে সরিয়ে ফেলুন তবে কোনও ফাইল নেই)


13

ধরুন আমার কাছে এই জাতীয় গাছ রয়েছে:

ROOTDIR
    └--SUBDIR1
        └----SUBDIR2
            └----SUBDIR3

আমি একটি কমান্ড সন্ধান করছি যে আমি যখন ইনপুট করি:

$ [unknown command] ROOTDIR

পুরো Dir গাছ মুছে ফেলা যাবে যদি কোন ফাইল কিন্তু পুরো গাছ ভিতরে শুধুমাত্র dirs হয় । তবে, SUBDIR1 এর অধীনে হ্যালো.পিডিএফ নামে একটি ফাইল আছে কিনা তা বলুন:

ROOTDIR
    └--SUBDIR1
        └--hello.pdf
        └----SUBDIR2
            └----SUBDIR3

তারপরে কমান্ডটি কেবলমাত্র SUBDIR2 এবং নীচে মুছে ফেলতে হবে।


উত্তর:


11

অ্যালেক্সিস কাছাকাছি। আপনার যা করা দরকার তা হ'ল:

find . -type d -depth -empty -exec rmdir "{}" \;

ডিরেক্টরি ট্রিটি প্রথম খালি ডিরেক্টরিটি না পাওয়া পর্যন্ত এটি প্রথমে ড্রিল করবে, তারপরে এটি মুছবে। সুতরাং মূল ডিরেক্টরিটি খালি তৈরি করা হবে যা পরে মুছে ফেলা হবে ইত্যাদি ইত্যাদি এটি পছন্দসই প্রভাব ফেলবে (আমি সম্ভবত সপ্তাহে 10 বার এটি করি তাই আমি নিশ্চিত যে এটি ঠিক)) :-)


-depthবিকল্প কেন প্রয়োজনীয়? find . -type d -empty -exec rmdir "{}" \;কাজ করা উচিত .... ঠিক?
অভিষেক এ

4
আপনি একটি গাছ (শুধুমাত্র ডিরেক্টরি) থাকতে বিবেচনা করুন foo/bar/baz। আপনি যদি না ব্যবহার করেন তবে -depthএটি fooপ্রথমে মুছে ফেলার চেষ্টা করবে , ব্যর্থ হবে এবং foo/barদৌড়ানোর পরে শেষ হবে ।
l0b0

1
সম্ভবত ব্যাচের অপসারণ ডিরেক্টরিগুলি +পরিবর্তে বিকল্পটি ব্যবহার করা ;। যেহেতু আপনি এটি গভীরতার সাথে করছেন - বাচ্চাদের এখনও পিতামাতার আগে মুছে ফেলা হবে (সম্ভবত আপনার rmdir / বাশনের সংস্করণের উপর নির্ভরশীল এবং rmdir এর উপর নির্ভরশীল কোনও কিছু ছাড়াই ডিরেক্টরিগুলি মুছে ফেলবে না)। এটি আমার জন্য সাইগউইনের বাশে কাজ করে:mkdir -p a/b/c/d ; find a -depth -type d -exec rmdir {} +
ইডব্রি

4
লোকেরা, নীচে go2null এর আরও অনেক সংক্ষিপ্ত উত্তরের জন্য যান! বুঝতে পারেন না যে এসই কেন নীচের প্রশ্নের উত্তরগুলি দেখানোর ক্ষেত্রে বেশিরভাগ আপোভোটের সাথে উত্তর না দিয়ে গৃহীত উত্তরগুলিকে অগ্রাধিকার দেয়। ওপি তার চয়ন করার সময় উপলব্ধ সেরা উত্তরটি গ্রহণ করে, তবে পরে আরও অনেক ভাল উত্তর আসতে পারে যা সম্প্রদায়টি সমর্থন করে, না? (অবশ্যই, এটি মেটা জন্য কিছু ...)
জামাদগনি

এটি আমার পক্ষে কাজ করে না। এটি কেবল গভীরতম পাতা মুছবে (এই ক্ষেত্রে SUBDIR3)
জোয় বারুচ ২

24
find ROOTDIR -type d -empty -delete

একই রকম

find ROOTDIR -type d -depth -empty -exec rmdir "{}" \;

তবে বিল্ট ইন "-ডিলিট" অ্যাকশন ব্যবহার করে।

নোট করুন যে "-ডিলিট" "-ডেপথ" বোঝায়।


সন্ধানের নিজস্ব বিল্ট-ইন মুছন ব্যবহার করে সর্বাধিক সংক্ষিপ্ত উত্তরের জন্য কুডোস! আমি আমার স্থানীয় ব্যবহারকারীর মধ্যে এটি যুক্ত করছি!
জামাদগনি


1

এটি নিরাপদে করার আগে আমাদের এখানে কিছু প্রয়োজনীয়তা রয়েছে:

  1. প্রথমে উপ-ডিরেক্টরিগুলি এবং তারপরে উপরের স্তরের ডিরেক্টরিগুলি সরিয়ে ফেলুন, অর্থাৎ আমাদের ডিরেক্টরি তালিকা বাছাই করতে হবে বা rmdir - প্যারেন্টস পতাকা ব্যবহার করতে হবে
  2. শুরু করে ফাইলগুলি দিয়ে আশ্চর্যতা এড়াতে সর্বদা / বা ./ দিয়ে রুটডিআর শুরু করুন -
  3. স্পেস সহ ডিরেক্টরি নামের সাথে কাজ করার জন্য NUL সমাপ্ত ডিরেক্টরিগুলির ব্যবহার করুন

শেলটিতে আমি এটি কীভাবে করব:

find ./ROOTDIR -type d | sort -r | tr '\n' '\000' | xargs -0 rmdir --ignore-fail-on-non-empty

যদি আপনি কিছু অপ্রয়োজনীয় ত্রুটিগুলি মনে না করেন তবে আপনি কেবল পিতামাতার সাথে সমস্ত ডিরেক্টরি মুছে ফেলার জন্য জোর করতে পারেন এবং আপনার কোনও বাছাই করার প্রয়োজন নেই (আপনি এনআুল টার্মিনেটেড স্ট্রিংগুলি ট্রাট করতে পারবেন না যা ট্রের প্রয়োজন হয়)

find ./ROOTDIR -type d -print0 | xargs -0 rmdir --ignore-fail-on-non-empty --parents

আপনার উত্তরের বিশদ ব্যাখ্যার জন্য কুডোস। @ Go2null এর উত্তরের -empty -deleteবিকল্পগুলি findনা শিখলে আমি সম্ভবত একই পদ্ধতি ব্যবহার করতাম ।
ডিভোর কিউবারিক

0
rmdir $(find ROOTDIR -type d | sort -r)

5
ডিরেক্টরি নামের যে কোনওটিতে শ্বেত স্পেস বা গ্লোববিং অক্ষর থাকলে এটি কাজ করবে না। ফাইলের নামের তালিকায় কমান্ড প্রতিস্থাপন ব্যবহার করা সাধারণত একটি খারাপ ধারণা idea এটা বিশেষ করে সঙ্গে একটা খারাপ ধারণা findকারণ findপ্রক্রিয়াকরণ পরিচ্ছন্ন করতে একটি উপায় আছে: find … -exec
গিলস'স'-দুষ্ট হওয়া বন্ধ করুন '

গিলসকে এটি নির্দেশ করার জন্য ধন্যবাদ। @ অ্যালানজ, সাধারণত এটি একটি আদেশ না দিয়ে পোস্ট করে যা এটি করে (এবং এই ক্ষেত্রে সমস্যাগুলি) যথেষ্ট নয়। আপনার উত্তর যোগ করুন।
n0pe

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