क्यों यह rm -rf है और rmdir -rf नहीं है


13

मैं हमेशा उत्सुक रहा हूं कि एक निर्देशिका में सब कुछ हटाने की आज्ञा क्यों है rm -rf

क्यों नहीं झंडे के साथ एक ही बात कर रहे हैं rmdir?

क्या rmdirनिर्देशिका संचालन के लिए उपयोग करना अधिक सहज नहीं होगा ?


9
rmdirनिर्देशिकाओं को हटाता है, rmहटाता है। rmdirगैर-निर्देशिकाओं को हटाने के लिए यह सहज क्यों होगा ?
स्टीफन चेज़लस

5
क्योंकि यह नहीं है। आपको यह सवाल पूछने में 40-साल की देरी हो रही है और आप गलत लोगों से पूछ रहे हैं।
user207421

जवाबों:


25

प्रारंभिक यूनिक्स फाइल सिस्टम में (कम से कम V7 दिनों में लगभग 1970) निर्देशिकाओं को विशेष फाइलों के रूप में लागू किया गया था और केवल रूट mknod(2)सिस्टम कॉल का उपयोग कर सकता था जो उन्हें बनाया गया था और केवल रूट unlink(2)एक निर्देशिका विशेष फाइल कर सकता था ।

फाइल सिस्टम संरचना को सुसंगत बनाए रखने के लिए ये सुरक्षाएँ लागू थीं। उदाहरण के लिए, यदि किसी उपयोगकर्ता को निर्देशिका विशेष फ़ाइल में लिखने की अनुमति दी गई थी, तो वह अपने मूल निर्देशिका ..को स्वयं को इंगित कर सकता है (विशेष रूप से अपना स्वयं का नोड)। यह फाइल सिस्टम में एक सर्कुलर रेफरेंस तैयार करेगा जो एक बैड थिंग होगा। बेशक वहाँ अन्य विसंगतियां हैं जो कोई भी कर सकता है, यह सिर्फ एक स्पष्ट उदाहरण है।

निरंतरता को उपयोगकर्ता-अंतरिक्ष कार्यक्रमों द्वारा बनाए रखा गया था जैसे कि mkdir(1)और rmdir(1)जो सेट-यूआईडी रूट थे ताकि वे एक अनपेक्षित उपयोगकर्ता की ओर से विशेषाधिकार प्राप्त सिस्टम कॉल कर सकें। जब पुनरावृत्ति को जोड़ा गया था rm(1), तो हटाए गए कमांड वर्तमान यूआईडी के रूप में चलेंगे और फिर rmdir(1)खाली निर्देशिकाओं को हटाने के लिए पूरी तरह से कॉल करेंगे । यह अभी भी अनुमति के उन्नयन का एक सुंदर मानक तरीका है: आपकी आवश्यकता से अधिक अनुमतियों का उपयोग न करें।

कुछ समय बाद mkdir(2)और rmdir(2)अपने स्वयं के सिस्टम कॉल के रूप में जोड़े गए लेकिन बीच का संबंध rm(1)और rmdir(1)बना हुआ है।

व्यक्तिगत रूप से, मुझे यह एक और अधिक संतोषजनक लग रहा है rmdir junkऔर मुझे पता है कि मैंने जो सबसे बुरा किया वह एक खाली निर्देशिका को हटा दिया गया था।


1
अंतिम वाक्य को फिर से लिखें: संभवतः, यदि रिकर्सिव डिलीट ऑपरेशन चालू था rmdir, तब भी उसे एक -rध्वज की आवश्यकता होगी । (के rmdir -r junkबजाय rm -r junkऔर rmdir junkअभी भी केवल काम करता है अगर निर्देशिका खाली है)
user253751

7

यह ऐतिहासिक है। rmफ़ाइलों के संदर्भों को हटाने के लिए, rmdirनिर्देशिकाओं को हटाने के लिए बनाया गया था, जिसके समानांतर mkdir। कई साल पहले, यूनिक्स rmकेवल निर्देशिकाओं को लागू करके हटा सकता था rmdirrmdir(2)सिस्टम कॉल भी नहीं था , rmdirएक प्रोग्राम था जिसे कॉल किया गया था unlink(2)

संदर्भ:


2

विशुद्ध रूप से राय की बात है, लेकिन निर्देशिकाओं को हटाते rmसमय फाइलें rmdirनिकालता है। एक निर्देशिका एक फ़ाइल है, लेकिन एक विशेष प्रकार की फ़ाइल है, इसलिए यह rmउन्हें हटाने के लिए समझ में आता है, लेकिन उन्हें विशेष रूप से व्यवहार करने के लिए (यानी क्षमता को सक्षम करने के लिए एक अतिरिक्त विकल्प की आवश्यकता होती है।) दूसरी तरफ सभी फाइलें निर्देशिका नहीं हैं। और यह कोई मतलब नहीं है कि IMHO के rmdirलिए कुछ है जो एक निर्देशिका नहीं है हटाने के लिए ।


1
अगर ऐसा था, तो rmएक खाली निर्देशिका (पुनरावर्ती मोड को छोड़कर) को क्यों नहीं हटाया जा सकता है ?
user253751

समान कारण यह एक पूर्ण निर्देशिका नहीं निकाल सकता है - यह -rनिर्देशिका विशेष फ़ाइल सुविधा को सक्षम करने के लिए ध्वज की आवश्यकता है ।
डार्विन वॉन कोरेक्स

1
परिपत्र तर्क वहाँ ...
user253751

मैं कहूंगा कि मेरे तर्क में एक विलक्षणता है ... 1 ...
डार्विन वॉन कोरेक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.