আরএম কি পুনরাবৃত্তভাবে খালি ডিরেক্টরি মুছে ফেলতে পারে?


9

ইউনিক্সের পুরানো সংস্করণে rmকমান্ড ডিরেক্টরিগুলি খালি থাকলে মুছে ফেলত। আরএম এর গবেষণা ইউনিক্স অষ্টম সংস্করণ ম্যান পৃষ্ঠা থেকে : "যদি কোনও এন্ট্রি ডিরেক্টরি হয় তবে এটি খালি হলেই তা সরানো হবে।" আমি এই আচরণটি পছন্দ করি, তাই আমার মধ্যে এটির নামটি পাওয়া গেল /etc/profile: alias rm='rm -d'আমি জিএনইউ কোর্টিলস সংস্করণটি ব্যবহার করছি rm, যাতে খালি থাকলে ডিরেক্টরিগুলি এগিয়ে যেতে এবং সরানোর জন্য -dবলা rmহয়।

এ পর্যন্ত সব ঠিকই. এই উপন্যাসটি আমাকে rmপুরানো দিনের মতো ব্যবহার করতে দেয় । তবে আমি এটিকে আরও একধাপ এগিয়ে নিয়ে যেতে চাই। আমি পছন্দ করবrmডিরেক্টরিতে অন্য ডিরেক্টরি রয়েছে এমনকী ডিরেক্টরি মুছে ফেলার জন্য, কারণ ডিরেক্টরিগুলি কেবল সেখানেই থাকে। ডিরেক্টরি কাঠামোটি কত গভীর হয় তাতে কিছু যায় আসে না, যতক্ষণ না সেখানে কোনও ফাইল নেই, কেবল খালি (একবার আপনি নীচে rmপৌঁছে যাবেন), আমি সেগুলি মুছে ফেলতে চাই ।

এটি কি এমন কোনও উপনাম হিসাবে লেখা যেতে পারে যা এখনও নিয়মিত হিসাবে কাজ করবে rmএবং এতে পাস হওয়া কোনও ফাইল মুছে ফেলবে ?


কীভাবে rmdir -p?
কেভিন

কেভিন পরামর্শ দেওয়ার জন্য ধন্যবাদ, তবে এটি এমন আচরণ নয় যা আমি সন্ধান করছি। যদি আমি দৌড়ে mkdir -p a/b1/c2 && mkdir -p a/b2/c2; rmdir -p a/b1/c1;যাই তবে আমি এখনও একটি, একটি / বি 2, এবং একটি / বি 2 / সি 2 রেখেছি। আমি যা চাই তা হ'ল কেবল শীর্ষ স্তরের (এই ক্ষেত্রে) পাস rmকরা এবং এর নীচে সমস্ত কিছু সরিয়ে ফেলা।
হোয়াইটহোটলভটাইগার

উত্তর:


8

আপনি একটি ডিরেক্টরি ট্রি অতিক্রম করতে এবং এটি ডিরেক্টরি ছাড়া অন্য কিছু রয়েছে কিনা তা দেখতে চান। এটি rmএর ক্ষমতার বাইরে । আপনার অন্যান্য সরঞ্জাম যেমন প্রয়োজন find। আপনি কোনও প্রদত্ত ডিরেক্টরিতে খালি ডিরেক্টরিগুলি এইভাবে মুছতে পারেন ( -depthপ্যারেন্ট ডিরেক্টরিগুলি যা খালি হয়ে যায় তাও মুছে ফেলা হয়):

find "$x" -depth -type d -exec rmdir {} +

এখানে একটি ফাংশন যা প্রতিটি আর্গুমেন্টের জন্য, আর্গুমেন্টটিকে মুছে ফেলা হয় যদি এটি একটি ডিরেক্টরি-নির্দেশিকা ফাইল বা ডিরেক্টরি ট্রি থাকে তবে ডিরেক্টরি ছাড়া অন্য কিছু থাকে না। মনে রাখবেন যে এই ফাংশনটি পারমাণবিক নয়: চলমান চলাকালীন যদি কোনও একটি আর্গুমেন্ট পরিবর্তিত হয় তবে আপনি একটি ত্রুটি বার্তা দিয়ে শেষ করতে পারেন তবে এটি নিরাপদ যে এটি কোনও ডিরেক্টরি ডিরেক্টরিতে যুক্তি হিসাবে পাস হওয়া কোনও ডিরেক্টরিকে মুছে ফেলবে না safe

rm () {
  ret=0
  for x; do
    case $x in -*) x=./$x;; esac
    if [ -d "$x" ]; then
      if [ -n "$(find "$x" ! -type d | head -n 1)" ]; then
        echo 1>&2 "$x: non-empty directory tree"
        ret=2
      else
        find "$x" -depth -exec rmdir {} +
        if [ -d "$x" ]; then ret=2; fi
      fi
    else
      command rm "$x" || [ $ret -gt 1 ] || ret=2
    fi
  done
  return $ret
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.