Rmdir (1) और rm (1) के सह-अस्तित्व का कारण क्या है?


17

मैं हर दिन बीएसडी और लिनक्स का उपयोग करता हूं, मुझे कभी भी ऐसी परिस्थिति नहीं हुई जिसे मुझे rmdir (1) के बजाय rm (1) का उपयोग करना पड़े। Rmdir के अस्तित्व का उद्देश्य क्या है?


2
OT, लेकिन, FWIW, यह दिलचस्प (और अलग) उपयोग दिखाता है: cyberciti.biz/faq/linux-unix-remove-directory
pst

जवाबों:


27

मुख्य कारण शायद ऐतिहासिक है। पुराने, पुराने दिनों में, कोई rmdir(2)और mkdir(2)सिस्टम कॉल नहीं थे (हम यहां 7 वें संस्करण UNIX ™ पर चर्चा कर रहे हैं), और rmdir(1)एक SUID रूट प्रोग्राम था जो unlink(2)निर्देशिकाओं को हटाने के लिए सिस्टम कॉल का उपयोग करता था ।

7 वें संस्करण UNIX मैनुअल http://cm.bell-labs.com/7thEdMan पर ऑनलाइन उपलब्ध हैं (अंतिम बार 2017-04-23 की जाँच की गई); वे http://plan9.bell-labs.com/7thEdMan पर भी उपलब्ध हैं (अंतिम बार 2017-04-23 की जांच की गई)। वहाँ भी लगता है कि कम से कम एक वैकल्पिक स्रोत ऑनलाइन - http://wolfram.schneider.org/bsd/7thEdManVol2/ - वॉल्यूम 2 ​​में लेखों के लिए, वॉल्यूम 1 में कमांड और सिस्टम कॉल के लिए FreeBSD साइट के लिंक के साथ। ।

rmआदेश (एक नियमित रूप से गैर SUID कार्यक्रम) लागू rmdir(1)खाली निर्देशिका को दूर करने के आदेश। यह स्वयं ऐसा नहीं कर सकता था; आवश्यक विशेषाधिकार तो, rmdir(1)आदेश (देखें यहाँ यूनिक्स V7 में अपने स्रोत कोड के लिए) खाली निर्देशिका दूर करने के लिए ही अस्तित्व में है, और rmआदेश खाली निर्देशिका खुद को नहीं निकाला।

rmनिर्देशिकाओं को हटाने के लिए उपयोग करने के लिए, आपको -rविकल्प देना होगा ।

एक सममिति तर्क भी है। mkdir(1)निर्देशिका बनाने के लिए आपको एक कमांड की आवश्यकता होती है ; यह उचित है कि rmdir(1)जो mkdir(1)किया उसे पूर्ववत करने का आदेश दिया। प्लस rmdir(2)और mkdir(2)सिस्टम कॉल के वे (इन दिनों) सरल अभ्यासकर्ता हैं - हां, 7 वें संस्करण में वापस UNIX, mkdir(1)एक SUID रूट प्रोग्राम भी था, mknod(2)डायरेक्टरी नोड link(2)बनाने के लिए कॉल का उपयोग करके .और ..डायरेक्टरी में और प्रविष्टियां बनाने के लिए कॉल। ।


अहा! यह सब समझ में आता है, महान!

2
अच्छा लगा। मैंने अभी 3BSD की एक प्रति जाँची है जो मेरे पास है और वहाँ rmdir syscall के लिए कोई प्रलेखन नहीं है, और rmdir (1) अभी भी अनलिंक का उपयोग करके लागू किया गया है।
एंडी रॉस

4
मैक्कोड + लिंक और अनलिंक सिस्टम का एक प्रमुख पहलू यह था कि एक निर्देशिका बनाना एक परमाणु ऑपरेशन नहीं था, इसलिए आप आंशिक रूप से पूर्ण निर्देशिका के साथ समाप्त हो सकते हैं। उठी विसंगतियों के लिए फ़ाइल सिस्टम की जाँच करने के लिए बहुत सारे कार्यक्रम तैयार किए गए थे; fsck(1)जो बच गया है।
जोनाथन लेफ्लर

@ जोनाथन, उस एक पर एक्सनिक्स की यादें वापस ला रहा है। नीरस हाँ, वास्तव में बुरी चीजें हो सकती हैं।
फियास्को लैब्स

6

"आरएम" निर्देशिकाओं पर काम नहीं करता है। आपको या तो rmdir का उपयोग करना होगा या एक पुनरावर्ती विलोपन के लिए -r स्विच निर्दिष्ट करना होगा। कारण ऐतिहासिक है: unlinkऔर rmdirअलग-अलग सिस्टम कॉल हैं और यूनिक्स के शुरुआती दिनों से हैं।


4
एक खुश पक्ष प्रभाव यह है कि जब आप केवल एक फ़ाइल को हटाने का इरादा रखते हैं तो आप गलती से किसी निर्देशिका को हटा सकते हैं।

धन्यवाद। मैंने देखा कि "rm -r" और "rmdir" में समान स्ट्रोक होते हैं। क्या ऐतिहासिक कारण से rmdir शुद्ध रूप से मौजूद है (.. दशकों पुराने यूनिक्स कार्यक्रमों के साथ संगत है)?

2
वास्तव में, यूनिक्स के शुरुआती दिनों में वापस, न तो rmdir(2)है और न ही mkdir(2)एक प्रणाली कॉल के रूप में अस्तित्व में थी; उपयोगकर्ता निर्देशिका नोड बनाने के rootलिए mknod(2)कॉल का उपयोग कर सकता है और निर्देशिका में प्रविष्टियां और प्रविष्टियां link(2)बनाने के लिए कॉल कर सकता है ; और निर्देशिका प्रविष्टियों को हटाने के लिए कॉल का उपयोग कर सकता है । ...rootunlink(2)
जोनाथन लेफलर

3

इसके अलावा rmdir केवल खाली निर्देशिका को हटाता है । यदि आप यह सुनिश्चित करना चाहते हैं कि आप किसी निर्देशिका में किसी अतिरिक्त फ़ाइल को नहीं हटाते हैं, rmdirतो इससे अधिक सुरक्षित है rm -r(सिवाय इसके कि यदि आप उर्फ ​​आरएम ऐसे हैं, तो आपको हमेशा पुष्टि करनी होगी कि आप क्या हटाते हैं, अर्थात alias rm='rm -i'~ / .bashrc या आप जो भी उपयोग कर रहे हैं। )।


1

इसके अलावा, rmdirग्लोबिंग (वाइल्डकार्ड) अभिव्यक्तियों के साथ खाली निर्देशिकाओं को निकालना आसान बनाता है। उदाहरण के लिए, /tmpसामग्री के साथ किसी भी फाइल या निर्देशिका को छूने के बिना सभी खाली निर्देशिकाओं को हटाने के लिए :

cd /tmp ; rmdir *

का उपयोग करने पर विचार करें rmdir /tmp/*। यदि /tmpनिर्देशिका वास्तव में बड़ी है, तो यह नाम प्रति अतिरिक्त पाँच वर्णों के कारण तर्कों के लिए थोड़ी जल्दी निकल सकता है, लेकिन इसके लिए cdआपको निर्देशिका पदानुक्रम के आसपास जाने की आवश्यकता नहीं है । यह rmdir /tmp/* 2>/dev/nullत्रुटि संदेशों को देखने से बचने के लिए भी विचार करने योग्य है (आमतौर पर बहुत कुछ होगा, और उनमें से लगभग सभी उस कार्य के लिए अप्रासंगिक होंगे)।
जोनाथन लेफ़लर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.