'Cp` और `rm` निर्देशिकाओं को अलग-अलग क्यों मानते हैं?


10

नियमित फ़ाइल से अलग निर्देशिकाओं को क्यों पसंद करते हैं cpऔर rmइलाज करते हैं? वे दोनों को स्पष्ट रूप से निर्दिष्ट करने के लिए उपयोगकर्ता की आवश्यकता है कि वह एक पुनरावर्ती व्यवहार चाहता है, अन्यथा वे निर्देशिकाओं से बिल्कुल नहीं निपटेंगे।

कंप्यूटर के साथ मेरा पहला इंटरैक्शन (थोड़ी देर पहले) विंडोज़ / GUI / पॉइंट-एंड-क्लिक / ड्रैग-एंड-ड्रॉप वातावरण पर था, यह हमेशा स्वाभाविक लगता था कि ये ऑपरेशंस लक्ष्य की परवाह किए बिना समान व्यवहार करेंगे।

जब मैं वाइल्डकार्ड के साथ आदेश देता हूं तो यह व्यवहार मुझे विशेष रूप से निराश करता है। क्या होगा यदि मैं एक निर्देशिका में सब कुछ निकालना चाहता हूं ( *) गैर-खाली उपखंडों को छोड़कर ?

मैं केवल कल्पना कर सकता हूं कि उपयोगकर्ता को पैर में खुद को गोली मारने से रोकने के लिए यह किसी प्रकार की सुरक्षा सुविधा है, लेकिन यह कुछ यूनिक्स सिद्धांतों की मेरी समझ का विरोधाभासी है:

  • यूनिक्स आमतौर पर उपयोगकर्ता को खुद से बचाता नहीं है। यह हमेशा माना जाता है कि उपयोगकर्ता जानता है कि वह क्या कर रहा है।
  • यूनिक्स के लिए सब कुछ एक फाइल है। एक निर्देशिका सिर्फ एक और फ़ाइल नहीं है? उनके साथ अलग तरह से व्यवहार क्यों किया जाता है?

मेरे सवाल:

  • क्या यह व्यवहार एक तकनीकी सीमा से उपजा है या यह एक जानबूझकर पसंद है?

और बाद के मामले में,

  • क्या इस विकल्प को प्रेरित करने वाले कारणों का कोई ऐतिहासिक विवरण है?

के लिए rmकम से कम, अगर आप चाहते हैं कि यह फ़ाइल और निर्देशिका के बीच अंतर की अनदेखी करने के लिए, आप अपने में डाल सकते हैं ~/.bashrcफ़ाइल: alias rm='rm -r'
बेनजीवेब

1
यह भी देखें अलग लेकिन संबंधित सवाल unix.stackexchange.com/questions/46066/...
derobert

1
आप Windows फ़ाइल प्रबंधक के साथ cp और rm की तुलना नहीं कर सकते। Cmd.exe प्रारंभ करें और प्रतिलिपि और डेल का प्रयास करें और व्यवहार की तुलना करें।
ott--

जवाबों:


11

Derobert's Why unix mv प्रोग्राम को डायरेक्ट्री के लिए -R (पुनरावर्ती) विकल्प की आवश्यकता नहीं है, लेकिन cp को इसकी आवश्यकता है? मूल रूप से आपके प्रश्न का उत्तर देता है: एक नियमित फ़ाइल की प्रतिलिपि बनाना या हटाना एक निर्देशिका के साथ एक ही ऑपरेशन करने से अलग है, क्योंकि एक निर्देशिका के लिए आपको उसमें निहित सभी फाइलों को संसाधित करना होगा। इसलिए ऑपरेशन मौलिक रूप से अलग है।

यह भी ध्यान देने योग्य है कि एक विशेष उपयोगिता है rmdirजो केवल खाली निर्देशिका पर कार्य कर सकती है। तथ्यों की जाँच के बिना यह निष्कर्ष निकालता है कि शायद मूल रूप rmसे केवल गैर-निर्देशिकाओं को हटाने में सक्षम था और गहरे rmनिर्देशिका को खाली निर्देशिकाओं का उपयोग करके और फिर rmdirउन्हें हटाने के लिए प्राप्त करना था।


rmdirउस सिस्टम कॉल का नाम भी है जिसका उपयोग किसी निर्देशिका को हटाने के लिए किया जाता है। सिस्टम कॉल के लिए निर्देशिका खाली होनी चाहिए, और unlinkकमांड और यूटिलिटी के समान ही नाम की उपयोगिता "फ्रंट-एंड" है ।
जोर्डनम

वास्तव में - यही मुझे विश्वास rmदिलाता है कि मूल रूप से निर्देशिकाओं को हटाने में असमर्थ रहा है (क्योंकि कमांड लाइन उपयोगिताओं अक्सर syscalls के आसपास बस अपेक्षाकृत सरल आवरण हैं)।
पेट्रफ

मेरे प्रश्न का शीर्षक यह सोचने के लिए गलत हो सकता है कि मैं तकनीकी विवरण के बारे में पूछ रहा हूं। मैं पूछ रहा था कि क्या यह एक जानबूझकर पसंद है। मुझे आश्चर्य है कि अगर मैं यह सोचने के लिए केवल एक ही हूं कि एक अंत-उपयोगकर्ता बिंदु से यह व्यवहार असंगत है। मैं आपके उत्तर को स्वीकार कर रहा हूं क्योंकि यह अप्रत्यक्ष रूप से मेरे प्रश्न का उत्तर देता है: यूनिक्स इंटर्नल (तकनीकी स्तर पर) में तकनीकी सीमाएं इस व्यवहार की उत्पत्ति प्रतीत होती हैं, और विरासत शायद हमें आज किसी अन्य तरीके से ऐसा करने से रोकती है। "सिसकल्स के आसपास सरल रैपर" हमें अधिक बुद्धिमान व्यवहार देने वाले नहीं हैं?
रहमू

2
अंत-उपयोगकर्ता POV से, यह वास्तव में अजीब लगता है, लेकिन आप वास्तव में कारणों के बारे में पूछ रहे थे। :) रैपर के लिए - यह सब इस बात पर निर्भर करता है कि वे "सरल" हैं (और जिसे आप अभी भी "सरल" कहना चाहते हैं)। आधुनिक rmनिश्चित रूप से केवल एक साधारण आवरण नहीं है (यह एक ही बार में मैरो फ़ाइलों को हटाने में सक्षम है और साथ ही निर्देशिकाएं भी)। यदि आप इसे -rविकल्प देना पसंद नहीं करते हैं, तो अपने शेल की अलियासिंग कार्यक्षमता का उपयोग करें या अपना स्वयं का आवरण बनाएं जो इसे डाल देगा (जो धीमा होगा, लेकिन आपके द्वारा उपयोग किए जा रहे शेल से स्वतंत्र है)।
पेट्रफ

2

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

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

तो rm -r को UNIX उपयोगकर्ताओं के जीवन को आसान बनाने के लिए एक फीचर के रूप में जोड़ा गया था, मानक "UNIX स्पिरिट" की कीमत में, क्योंकि यह क्लासिक UNIX उपयोगिताओं की तुलना में अधिक जटिल है क्योंकि यह निर्देशिकाओं के भीतर उतर रही है और फ़ाइलों को हटा रही है;

इसके अलावा, यूनिक्स के शुरुआती समय में, सिस्टम में बहुत अधिक मेमोरी नहीं थी, और एक निर्देशिका की पुनरावर्ती संरचना को मैप करने पर एक प्रदर्शन जुर्माना था, और कभी-कभी यह काम को विभाजित किए बिना करना असंभव था।

cp, एक फाइल पढ़ता है और इसे कॉपी करता है, ब्लॉक करके ब्लॉक करता है। यदि यह एक निर्देशिका को कॉपी करने के लिए था जैसा कि यह एक फ़ाइल करता है, तो यह उनकी संदर्भ गणना को बढ़ाए बिना फ़ाइलों के संदर्भों को जोड़ देगा, जिससे असंगत डेटा हो सकता है (यदि रीडिंग / लिखना एक इनोड में है जो उन ब्लॉक को मुक्त करता है जो उनके रूप में चिह्नित हैं। मूल इनोड को हटा दिया गया था), डेटा खो गया - चूंकि किसी फ़ाइल के अंतिम (ज्ञात) संदर्भ को हटाने से यह इनकोड संख्या को पुनर्नवीनीकरण किया जा सकता है।

Tl; dr भीड़ के लिए:
UNIX में निर्देशिकाएँ एक प्रकार की फ़ाइल हैं, यह सच है, लेकिन चूंकि उनके भीतर की जानकारी को सिस्टम द्वारा अलग तरह से व्यवहार किया जाता है, क्योंकि यह फाइल सिस्टम का मेटाडेटा है, फाइलों में हेरफेर करने वाली कमांड निर्देशिकाओं के बिना काम नहीं कर सकती हैं। आश्रित मेटाडेटा में हेरफेर करने के लिए उनके व्यवहार में परिवर्तन।

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