मैं हमेशा उत्सुक रहा हूं कि एक निर्देशिका में सब कुछ हटाने की आज्ञा क्यों है rm -rf
।
क्यों नहीं झंडे के साथ एक ही बात कर रहे हैं rmdir
?
क्या rmdir
निर्देशिका संचालन के लिए उपयोग करना अधिक सहज नहीं होगा ?
मैं हमेशा उत्सुक रहा हूं कि एक निर्देशिका में सब कुछ हटाने की आज्ञा क्यों है rm -rf
।
क्यों नहीं झंडे के साथ एक ही बात कर रहे हैं rmdir
?
क्या rmdir
निर्देशिका संचालन के लिए उपयोग करना अधिक सहज नहीं होगा ?
जवाबों:
प्रारंभिक यूनिक्स फाइल सिस्टम में (कम से कम V7 दिनों में लगभग 1970) निर्देशिकाओं को विशेष फाइलों के रूप में लागू किया गया था और केवल रूट mknod(2)
सिस्टम कॉल का उपयोग कर सकता था जो उन्हें बनाया गया था और केवल रूट unlink(2)
एक निर्देशिका विशेष फाइल कर सकता था ।
फाइल सिस्टम संरचना को सुसंगत बनाए रखने के लिए ये सुरक्षाएँ लागू थीं। उदाहरण के लिए, यदि किसी उपयोगकर्ता को निर्देशिका विशेष फ़ाइल में लिखने की अनुमति दी गई थी, तो वह अपने मूल निर्देशिका ..
को स्वयं को इंगित कर सकता है (विशेष रूप से अपना स्वयं का नोड)। यह फाइल सिस्टम में एक सर्कुलर रेफरेंस तैयार करेगा जो एक बैड थिंग होगा। बेशक वहाँ अन्य विसंगतियां हैं जो कोई भी कर सकता है, यह सिर्फ एक स्पष्ट उदाहरण है।
निरंतरता को उपयोगकर्ता-अंतरिक्ष कार्यक्रमों द्वारा बनाए रखा गया था जैसे कि mkdir(1)
और rmdir(1)
जो सेट-यूआईडी रूट थे ताकि वे एक अनपेक्षित उपयोगकर्ता की ओर से विशेषाधिकार प्राप्त सिस्टम कॉल कर सकें। जब पुनरावृत्ति को जोड़ा गया था rm(1)
, तो हटाए गए कमांड वर्तमान यूआईडी के रूप में चलेंगे और फिर rmdir(1)
खाली निर्देशिकाओं को हटाने के लिए पूरी तरह से कॉल करेंगे । यह अभी भी अनुमति के उन्नयन का एक सुंदर मानक तरीका है: आपकी आवश्यकता से अधिक अनुमतियों का उपयोग न करें।
कुछ समय बाद mkdir(2)
और rmdir(2)
अपने स्वयं के सिस्टम कॉल के रूप में जोड़े गए लेकिन बीच का संबंध rm(1)
और rmdir(1)
बना हुआ है।
व्यक्तिगत रूप से, मुझे यह एक और अधिक संतोषजनक लग रहा है rmdir junk
और मुझे पता है कि मैंने जो सबसे बुरा किया वह एक खाली निर्देशिका को हटा दिया गया था।
rmdir
, तब भी उसे एक -r
ध्वज की आवश्यकता होगी । (के rmdir -r junk
बजाय rm -r junk
और rmdir junk
अभी भी केवल काम करता है अगर निर्देशिका खाली है)
यह ऐतिहासिक है। rm
फ़ाइलों के संदर्भों को हटाने के लिए, rmdir
निर्देशिकाओं को हटाने के लिए बनाया गया था, जिसके समानांतर mkdir
। कई साल पहले, यूनिक्स rm
केवल निर्देशिकाओं को लागू करके हटा सकता था rmdir
। rmdir(2)
सिस्टम कॉल भी नहीं था , rmdir
एक प्रोग्राम था जिसे कॉल किया गया था unlink(2)
।
संदर्भ:
विशुद्ध रूप से राय की बात है, लेकिन निर्देशिकाओं को हटाते rm
समय फाइलें rmdir
निकालता है। एक निर्देशिका एक फ़ाइल है, लेकिन एक विशेष प्रकार की फ़ाइल है, इसलिए यह rm
उन्हें हटाने के लिए समझ में आता है, लेकिन उन्हें विशेष रूप से व्यवहार करने के लिए (यानी क्षमता को सक्षम करने के लिए एक अतिरिक्त विकल्प की आवश्यकता होती है।) दूसरी तरफ सभी फाइलें निर्देशिका नहीं हैं। और यह कोई मतलब नहीं है कि IMHO के rmdir
लिए कुछ है जो एक निर्देशिका नहीं है हटाने के लिए ।
rm
एक खाली निर्देशिका (पुनरावर्ती मोड को छोड़कर) को क्यों नहीं हटाया जा सकता है ?
-r
निर्देशिका विशेष फ़ाइल सुविधा को सक्षम करने के लिए ध्वज की आवश्यकता है ।
rmdir
निर्देशिकाओं को हटाता है,rm
हटाता है।rmdir
गैर-निर्देशिकाओं को हटाने के लिए यह सहज क्यों होगा ?