मैं क्यों नहीं हटा सकता ' निर्देशिका?


40

मैंने 'को हटाने की कोशिश की।' निर्देशिका। मैंने सोचा कि मैं अपनी वर्किंग डायरेक्टरी को बिना पेरेंट डाइरेक्टरी में जाने के डिलीट कर सकता हूँ।

मेरे सवाल का बिंदु कुछ अंतर्दृष्टि के लिए देखना है कि फाइलों को हटाने के लिए लिनक्स सिस्टम कैसे काम करता है।


1
Rm -r 'pwd' को मौजूदा dir को हटाने के लिए वास्तव में मूल dir में जाने के बिना
आज़माएं

7
यह प्रश्न उस एक की नकल नहीं करता है। यह पूछता है कि हार्ड लिंक संश्लेषित होने के बजाय एक भौतिक इकाई के रूप में क्यों मौजूद है। यह सवाल न केवल काम करने rm .और rmdir .न करने के लिए कहता है , लेकिन उन्हें काम नहीं करने के रूप में निर्दिष्ट किया जाता है, जो एक कठिन कड़ी के भौतिक अस्तित्व से स्वतंत्र है।
JdeBP

9
छवि आप एक शाखा को काटने के लिए एक पेड़ पर चढ़ गए हैं। जब आप देखना शुरू करते हैं तो आप किस कट पर बैठते हैं? (यह संक्षेप में लिनक्स फाइल सिस्टम है।)
माइकल

7
कर की कल्पना rm -rf .*केवल इस सहित न केवल पता लगाने के लिए ., लेकिन यह भी .., और फिर ../.., और फिर ...
Gerrit

जवाबों:


89

वर्तमान निर्देशिका को हटाने से फ़ाइल सिस्टम अखंडता या उसके तार्किक संगठन पर कोई प्रभाव नहीं पड़ता है। .हटाने को रोकने के लिए POSIX मानक का पालन किया जाता है जो rmdir(2)मैनुअल पेज में बताता है :

यदि पथ तर्क उस पथ को संदर्भित करता है जिसका अंतिम घटक या तो डॉट या डॉट-डॉट है, तो rmdir () विफल हो जाएगा।

rmमैनुअल पेज में एक तर्क पाया जा सकता है :

अनजाने में कुछ करने के परिणामों से बचने के लिए, डॉट उपयोगिता और नाम डॉट को हटाने के लिए rm उपयोगिता वर्जित है:

rm -r। *

दूसरी ओर, स्पष्ट रूप से वर्तमान निर्देशिका को हटाना (अर्थात इसका पूर्ण या सापेक्ष पथ बताते हुए) यूनिक्स के तहत एक अनुमत ऑपरेशन है, कम से कम एसवीआर 3 के बाद से क्योंकि यूनिक्स संस्करण 7 के साथ एसवीआर 2 तक निषिद्ध था। यह बहुत कुछ वैसा ही होता है जब आप किसी ऐसी फ़ाइल को हटाते हैं जिसे सक्रिय रूप से पढ़ा या लिखा जा रहा है। डिलीट फ़ाइल तक पहुँचने वाली प्रक्रियाएँ अपना पढ़ना और लिखना जारी रखती हैं जैसे कि कुछ नहीं हुआ। आपके द्वारा किसी प्रक्रिया वर्तमान निर्देशिका को हटा दिए जाने के बाद, यह निर्देशिका अधिक सुलभ नहीं है, हालांकि इसका पथ लेकिन इसका इनोड फ़ाइल सिस्टम पर मौजूद रहता है जब तक कि प्रक्रिया मर जाती है या अपनी स्वयं की निर्देशिका को बदल नहीं देती है।

ध्यान दें कि प्रक्रिया अपनी cwd (उदा cd ..) को बदलने के लिए अपनी वर्तमान निर्देशिका के सापेक्ष पथ का उपयोग करने में सक्षम नहीं होगी क्योंकि ..इसकी वर्तमान निर्देशिका में कोई प्रविष्टि नहीं है।

किसी प्रकार जब rmdir ., तो वे संभावित उम्मीद वर्तमान निर्देशिका प्रविष्टि हटा दिया जाना चाहिए, लेकिन जब एक निर्देशिका निकाल दिया जाता है (अपने रास्ते का उपयोग कर), तीन निर्देशिका प्रविष्टियों वास्तव में निकाल दिए जाते हैं, ., .., और निर्देशिका ही।

केवल .और इस निर्देशिका की निर्देशिका प्रविष्टि को हटाने से एक गैर अनुपालन निर्देशिका नहीं बनेगी, लेकिन जैसा कि पहले ही कहा गया है, यह मानक द्वारा निषिद्ध है।

जैसा कि @ इमानुएल ने ठीक ही कहा है, एक और कारण है जिसे हटाने .की अनुमति नहीं है। कम से कम एक POSIX अनुरूप ओएस (HFS + के साथ मैक ओएस एक्स) है, जो मजबूत प्रतिबंधों के साथ, मौजूदा निर्देशिकाओं को हार्डलिंक बनाने का समर्थन करता है। ऐसे मामले में, निर्देशिका के अंदर से कोई स्पष्ट तरीका नहीं है यह जानने के लिए कि किस हार्डलिंक को हटाने की उम्मीद है।


9
pubs.opengroup.org/onlinepubs/9699919799/functions/rmdir.html "pathname / dot को हटाने का अर्थ स्पष्ट नहीं है, क्योंकि हटाने के लिए मूल निर्देशिका में फ़ाइल (निर्देशिका) का नाम विशेष रूप से उपस्थिति में स्पष्ट नहीं है, एक निर्देशिका के लिए कई लिंक "
इमैनुएल

@Emmanuel एक निर्देशिका को हटाना जिसमें दो से अधिक लिंक हैं (यानी खाली नहीं है) पहले से ही डिज़ाइन (गैर रिक्त) द्वारा निषिद्ध है। एक की एक गिनती के साथ एक निर्देशिका मानक (कम से कम फ़ाइल सिस्टम के साथ मना किया जाता है जहां लिंक मायने रखता है)।
जूलियरे

3
@jlliagre: यह एक निर्देशिका का सवाल नहीं है जिसमें कई लिंक हैं, बल्कि एक निर्देशिका है जिसमें कई लिंक हैं। कुछ फाइलसिस्टम और / या ऑपरेटिंग सिस्टम इसे अस्वीकार करते हैं, लेकिन सभी नहीं।
डब्ल्यू पर Jörg W Mittag

@ एकाधिक निर्देशिका युक्त JörgWMittag एक निर्देशिका है क्योंकि उसकी उप-के सभी, डिजाइन द्वारा एकाधिक लिंक ..इससे जुड़े हों। यह link count > 2ओएस और फ़ाइल सिस्टम के भारी बहुमत के लिए अद्वितीय मामला है , इसलिए "कुछ फ़ाइल सिस्टम और / या ऑपरेटिंग सिस्टम" एक समझ है। एकमात्र गैर-ज्ञात ज्ञात अपवाद मैक ओएस एक्स है जिसमें एचएफएस + है जो हालांकि इस बारे में प्रतिबंध लगाता है कि कौन और क्या किया जा सकता है। दी गई पोसिक्स टिप्पणी इस विषमता को निर्देशित करती है। देखें unix.stackexchange.com/questions/22394/…
jlliagre

अरे, मैंने पहले किया है rm -r .*और यह मूल निर्देशिका के तहत सब कुछ फिर से उड़ा दिया ... यह एक या दो दशक पहले की तुलना में अधिक था, लेकिन rmअब यह जानने की अनुमति नहीं है।
अन्ताक

9

यह अखंडता के लिए उस तरह से किया जाता है जैसे आप वर्तमान में उस निर्देशिका के अंदर हैं और .केवल एक आत्म-संदर्भ है।

आपको या तो इसके मूल में जाने की आवश्यकता है या rmdirइसके पथ के साथ कॉल करना है, जिसे इसके साथ किया जा सकता है:

rmdir `pwd`

यदि आपको अक्सर ऐसा लगता है, तो आप इसके लिए एक उपनाम निर्धारित कर सकते हैं:

alias rmc='rmdir `pwd`'

.. जिसे rmcवर्तमान निर्देशिका को हटाने के लिए अकेले बुलाया जा सकता है ।


13
लेकिन क्यों / कैसे काल्पनिक rmdir .कमांड एक तरह से फ़ाइल सिस्टम अखंडता से समझौता करता है rmdir $(pwd)या rmdir "$PWD"नहीं करता है?
जी-मैन का कहना है कि 'मोनिका'

4
यह एफएस अखंडता का नहीं बल्कि तार्किक संगठन का मामला है। जब आप अपनी वर्तमान निर्देशिका चुनते हैं, तो आप इस निर्देशिका का उपयोग अपने आगामी कार्यों के लिए करने के लिए कहते हैं, लेकिन आप स्वयं से कुछ नहीं निकाल सकते।
जूली पेलेटियर

7
मुझे डर है कि यह अनुमान है।
इमैनुएल

4
@FranklinPiat मुझे आपकी टिप्पणी विशेष रूप से उपयोगी नहीं लगी: 1. ओपी का उपयोग कहां हुआ rm *, और शेल इतिहास से आपका क्या मतलब है? 2. उत्तर ने भाग को संबोधित क्यों किया , 3. विस्तृत करने के लिए देखभाल?
JBentley

4
@ जी-मैन यदि आप करते हैं rmdir $(pwd), pwdउदाहरण के लिए /foo/bar/baz, वर्तमान निर्देशिका के लिए एक तार्किक नाम का पता लगाता है , और फिर rmdir, उस पथ को देखकर, निर्देशिका bazसे प्रविष्टि को हटा देता है /foo/bar, बशर्ते कि शर्तें पूरी हों। यह समझ में आता है। rmdir .दूसरी ओर, कमांड .वर्तमान निर्देशिका से प्रविष्टि को हटाने के लिए एक निर्देश है , जिसे न तो अनुमति दी जाती है (यह बाधा का उल्लंघन करता है कि प्रत्येक निर्देशिका में .खुद को इंगित करने वाली प्रविष्टि है) या उपयोगी नहीं है (यह लिंक को नहीं हटाएगा आपको हटा दिया गया था )।
हॉब्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.