সাবট্রির সমস্ত খালি ডিরেক্টরি কীভাবে সরাবেন?


151

আমি কীভাবে সাবট্রির সমস্ত খালি ডিরেক্টরি মুছে ফেলতে পারি? আমি কিছু ব্যবহার

find . -type d -exec rmdir {} 2>/dev/null \;

তবে কেবল খালি ডিরেক্টরি সম্বলিত ডিরেক্টরিগুলি সরাতে আমার একাধিকবার চালানো দরকার। তদতিরিক্ত, এটি বেশ ধীর, বিশেষত সাইগউইনের অধীনে।


ইমাস সমাধানের জন্য emacs.stackexchange.com/q/12190/2264 দেখুন ।
শান অলরেড

উত্তর:


221

জিএনইউ findবিকল্পগুলি এবং পূর্বাভাসের সমন্বয় করে , এই আদেশটি কাজটি করা উচিত:

find . -type d -empty -delete
  • -type d ডিরেক্টরি সীমাবদ্ধ
  • -empty খালি বেশী সীমাবদ্ধ
  • -delete প্রতিটি ডিরেক্টরি মুছে ফেলা হয়

গাছটি পাতা দ্বারা নির্ধারিত প্রয়োজন ছাড়াই হাঁটা হয় -depthকারণ এটি দ্বারা বোঝানো হয়েছে -delete


2
-deleteইতিমধ্যে বোঝানো হয়েছে -depthযাতে আপনাকে এটি ম্যানুয়ালি নির্দিষ্ট করার দরকার নেই।
জামাদগনি

1
ধন্যবাদ, আমি বুঝতে পারি নি। উত্তর আপডেট হয়েছে।
ক্রিস্টোফ ড্রেভেট-ড্রুগেট

11
-mindepth 1শুরুর ডিরেক্টরিটি খালি থেকে মুছে ফেলা থেকে বিরত রাখতে আমি এখানে যুক্ত করব ।
গ্রেগ ডাবিকি

2
দুর্দান্ত, তবে আমার পুরানো
সানোস

2
!খোলসের একটি বিশেষ অর্থ রয়েছে। আপনার এড়াতে হবে এর মতো কিছু: \! -name 'Completed'ঠিক আগে -deleteকাজ করা উচিত। অথবা আপনি কেবল এই ডিরেক্টরিতে একটি মার্কার ফাইল রেখেছেন।
ক্রিস্টোফ ড্রেভেট-ড্রুগেট

53

ডিরেক্টরিগুলি গভীরভাবে নেস্টেড-প্রথমে তালিকাবদ্ধ করুন।

find . -depth -type d -exec rmdir {} \; 2>/dev/null

(মনে রাখবেন যে পুনর্নির্দেশটি findসম্পূর্ণভাবে কমান্ডের ক্ষেত্রে প্রযোজ্য , কেবল তেমন নয় rmdironly কেবলমাত্র পুনর্নির্দেশের rmdirফলে আপনাকে একটি মধ্যবর্তী শেলটি চাওয়া দরকার বলে উল্লেখযোগ্য মন্দ হতে পারে))

আপনি rmdirখালি খালি ডিরেক্টরিতে -emptyচালনাটি প্রিফিকেটটি পাস করে এড়াতে পারবেন । কমান্ডটি চালানোর সময় জিএনইউ ডিরেক্টরিটি পরীক্ষা করে, সুতরাং সবে খালি করা ডিরেক্টরিগুলি বাছাই করা হবে।

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

গতি বাড়ানোর আরেকটি উপায় rmdirহ'ল আমন্ত্রণগুলি গ্রুপ করা । দুটিই সম্ভবত আসলটির চেয়ে লক্ষণীয়ভাবে দ্রুততর হতে পারে, বিশেষত সাইগউইনের অধীনে। আমি এই দুটিয়ের মধ্যে খুব বেশি পার্থক্য আশা করি না।

find . -depth -type d -print0 | xargs -0 rmdir 2>/dev/null
find . -depth -type d -exec rmdir {} + 2>/dev/null

কোন পদ্ধতিটি দ্রুত তা নির্ভর করে আপনার কতটি খালি খালি ডিরেক্টরি রয়েছে on -emptyআমন্ত্রণগুলি গোষ্ঠীভুক্ত করার জন্য আপনি পদ্ধতির সাথে একত্রিত করতে পারবেন না , কারণ কেবলমাত্র ডিরেক্টরিগুলি খালি ডিরেক্টরি রয়েছে তা সময় না findদেখে খালি হয় না ।

আরেকটি পদ্ধতি হ'ল একাধিক পাস চালানো। এটি দ্রুততর কিনা তা অনেকগুলি বিষয়ের উপর নির্ভর করে, পুরো ডিরেক্টরি হায়ারার্কি findরানের মধ্যে ডিস্ক ক্যাশে থাকতে পারে কিনা তা সহ ।

while [ -n "$(find . -depth -type d -empty -print -exec rmdir {} +)" ]; do :; done

বিকল্পভাবে, zsh ব্যবহার করুন। উল্লিখিত glob কোয়ালিফায়ার F খালি নয় এমন ডিরেক্টরি সাথে মিলে যায়, তাই /^Fখালি ডিরেক্টরি সাথে মেলে। যে ডিরেক্টরিগুলিতে কেবল খালি ডিরেক্টরি থাকে সেগুলি এত সহজে মেলে না।

while rmdir **/*(/N^F); do :; done

( rmdirখালি কমান্ড লাইন পেলে এটি সমাপ্ত হয় ))


এটাই. 90 সেকেন্ডের পরিবর্তে এটি 0.90 সেকেন্ড নেয়।
মার্টিনাস

@ মাআর্টিনাস: আমি কৌতূহলী: আপনার কি এমন কোনও ডেটা সেট রয়েছে যেখানে আপনি চেষ্টা না করেই চেষ্টা করতে পারেন -p? আমি ভাবিনি এটি একটি পার্থক্য করতে হবে।
গিলস

3
@ মার্টিনাস - অন্যান্য সামান্য অপ্টিমাইজেশন: যুক্ত -emptyকরার সাথে এটির সাথে কাজ করা উচিত (যদিও আমি নিশ্চিত না যে এটি কতটা লাভ করবে)। এবং খুব, খুব তুচ্ছভাবে, যেহেতু আপনি সম্ভবত মুছে ফেলতে চান না ., ব্যবহার করুন -mindepth 1
ম্যাটডেম

এটি অপসারণ নয় তবে প্রক্রিয়াটি উপরিভাগে শুরু হয়েছিল, যা প্রায় পুরো সময় নেয়। আমি -depthযুক্তিটিকে উপেক্ষা করেছিলাম , যা rmdir -pঅকেজো করে তোলে । আমি আমার মন্তব্য ইতিমধ্যে পরিবর্তন করেছি। 90 টি আমার আসল চেষ্টা ছিল; এখানে অবাক হওয়ার মতো কিছু নেই।
মার্টিনাস

2
আমি বুঝতে পেরেছি যে আমরা rmdirএই কমান্ডটি দিয়ে কমপক্ষে কমপক্ষে জিএনইউ find . -depth -type d -empty -delete
সন্ধানের

6

যদি আপনি কেবল নিজের -pউপর নজর রাখেন rmdir, এটি এক পাসে কাজ করবে। এটি সুন্দর বা অনুকূল হবে না তবে এটি সব পাওয়া উচিত। এটি rmdir কে বলছে যে আপনি অপসারণ করছেন এমন কোনও খালি খালি অভিভাবক ডিরেক্টরি মুছে ফেলতে।

আপনি -emptyপরীক্ষাটি যোগ করে কিছুটা সঞ্চয় করতে পারেন , তাই এটি খালি নয় ডিরেক্টরিগুলি নিয়ে বিরক্ত করে না।


3

find . -depth -type d -exec rmdir {} +

এই প্রশ্নের সহজতম এবং মানক সম্মতিজনক উত্তর।

দুর্ভাগ্যক্রমে এখানে প্রদত্ত অন্য উত্তরগুলি সমস্ত বিক্রেতা নির্দিষ্ট বর্ধনের উপর নির্ভর করে যা সমস্ত সিস্টেমে বিদ্যমান নেই।


3
এই উত্তরটি প্রতিটি ডিরেক্টরির জন্য একটি ত্রুটি উত্থাপন করে যা মুছতে পারে না যা পছন্দসই চেয়ে কম হতে পারে।
উইলেম ভ্যান কেটভিচ

0

find . -type d -printf "%d %p\n" |\ sort -nr |\ perl -pe 's/^\d+\s//;' |\ while read dir; do \ (rmdir "$dir" > /dev/null 2>&1); \ done

এখানে কিভাবে এটা কাজ করে:

  1. অবিচ্ছিন্নভাবে সমস্ত ডিরেক্টরি তাদের গভীরতা সহ তালিকাভুক্ত
  2. ক্রমকে তাদের গভীরতার ক্রম অনুসারে বাছাই করুন
  3. কেবল ডিরেক্টরি পাথগুলি ফিল্টার করে
  4. rmdirএকের পর এক তালিকায় দৌড়ান

0

আমি এই উপাত্তগুলি ঘন ঘন ব্যবহৃত findকমান্ডগুলির জন্য ব্যবহার করি, বিশেষত যখন আমি দুপেইগুরু ব্যবহার করে ডিস্ক স্পেস পরিষ্কার করি , যেখানে ডুপ্লিকেটগুলি সরিয়ে ফেলার ফলে অনেকগুলি খালি ডিরেক্টরি হতে পারে।

ভিতরে মন্তব্যগুলি .bashrcতাই যখন আমি এটি টুইট করার দরকার পরে আমি সেগুলি ভুলে যাব না।

# find empty directories
alias find-empty='find . -type d -empty'

# fine empty/zero sized files
alias find-zero='find . -type f -empty'

# delete all empty directories!
alias find-empty-delete='find-empty -delete'

# delete empty directories when `-delete` option is not available.
# output null character (instead of newline) as separator. used together
# with `xargs -0`, will handle filenames with spaces and special chars.
alias find-empty-delete2='find-empty -print0 | xargs -0 rmdir -p'

# alternative version using `-exec` with `+`, similar to xargs.
# {}: path of current file
# +: {} is replaced with as many pathnames as possible for each invocation.
alias find-empty-delete3='find-empty -exec rmdir -p {} +'

# for removing zero sized files, we can't de-dupe them automatically
# since they are technically all the same, so they are typically left
# beind. this removes them if needed.
alias  find-zero-delete='find-zero -delete'
alias find-zero-delete2='find-zero -print0 | xargs -0 rm'
alias find-zero-delete3='find-zero -exec rm {} +'

-2

rm -r */কমান্ড আমার জন্য সহজে কাজ করে। জোর করে ফাইল সহ ডিরেক্টরি মুছে ফেলা rmপ্রয়োজন -frm -rশুধুমাত্র খালি ডিরেক্টরি মুছে ফেলা উচিত। আমি কেন এই ভুল হতে পারে তা সম্পর্কে উন্মুক্ত। এটি */কেবল ফোল্ডারগুলিতে দেখায় তাই ফাইলগুলিও ছেড়ে দেওয়া উচিত ।


1
আমি প্রথমে rmদৃ remove়ভাবে এটি পরীক্ষা করার জন্য সুপারিশ করব যা প্রাথমিকভাবে ফাইলগুলি অপসারণ করার জন্য। যদিও */শুধুমাত্র ডিরেক্টরি সাথে মিলে যায়, আমি কোন ধারণা কি এটা গভীর স্তরে আছে আছে। আমি এটি কল্পনাও করতে পারি যে এটি কেবল কয়েকটি সিস্টেমে কাজ করে।
মার্টিনাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.