किसी नई निर्देशिका को इसमें जोड़ने से पहले 2 की हार्ड लिंक गिनती क्यों होती है?


38

कहते हैं कि मैं सिर्फ डायरेक्टरी newDirectory बनाता हूं और फिर मैं ls -ld कमांड करता हूं। मैं देखता हूं कि हार्ड लिंक की संख्या 2 है। वास्तव में हार्ड लिंक 2 शुरू से क्या बनाता है? वर्तमान निर्देशिका में उप-सीमाओं की संख्या भी हार्ड लिंक की संख्या के बराबर है - 2?


जवाबों:


39

ऐतिहासिक रूप से , पहले यूनिक्स फाइलसिस्टम ने प्रत्येक निर्देशिका में दो प्रविष्टियाँ बनाईं: निर्देशिका की .ओर इशारा करते हुए, और ..उसके अभिभावक को इंगित करते हुए। इसने फाइलसिस्टम को पार करने का एक आसान तरीका प्रदान किया, दोनों अनुप्रयोगों के लिए और स्वयं ओएस के लिए।

इस प्रकार प्रत्येक निर्देशिका में 2 + n की लिंक संख्या होती है जहां n उपनिर्देशिकाओं की संख्या होती है। लिंक अपने मूल में उस निर्देशिका की .प्रविष्टि, निर्देशिका की अपनी प्रविष्टि और ..प्रत्येक उपनिर्देशिका में प्रविष्टि हैं। उदाहरण के लिए, मान लीजिए कि यह /parentसभी निर्देशिकाओं में निहित सबट्री की सामग्री है :

/parent
/parent/dir
/parent/dir/sub1
/parent/dir/sub2
/parent/dir/sub3

फिर dir5 का एक लिंक गणना है: dirमें प्रवेश /parent, .में प्रवेश /parent/dir, और तीन ..में से प्रत्येक में प्रविष्टियों /parent/dir/sub1, /parent/dir/sub2और /parent/dir/sub3। चूंकि /parent/dir/sub1कोई उपनिर्देशिका नहीं है, इसकी लिंक गणना 2 है ( sub1प्रवेश /parent/dirऔर .प्रवेश /parent/dir/sub1)।

रूट निर्देशिका के लिए विशेष आवरण की मात्रा को कम करने के लिए, जिसमें "उचित" अभिभावक नहीं है, रूट निर्देशिका में ..स्वयं को इंगित करने वाली प्रविष्टि है। इस तरह, यह भी, 2 प्लस और उपनिर्देशिकाओं की संख्या की एक गिनती संख्या है, 2 जा रहा है /.और /..

बाद में फ़ाइल सिस्टम स्मृति में माता पिता निर्देशिका का ट्रैक रखने और आम तौर पर की जरूरत नहीं है करने की प्रवृत्ति है .और ..वास्तविक प्रविष्टियों के रूप में मौजूद करने के लिए; विशिष्ट आधुनिक यूनिक्स सिस्टम , फाइलसिस्टम-प्रकार-स्वतंत्र फाइलसिस्टम कोड के हिस्से के रूप में विशेष मान .और व्यवहार करते हैं ..। कुछ फाइल सिस्टम में अभी भी शामिल हैं .और ..प्रविष्टियां हैं, या डिस्क पर कुछ भी नहीं होने के बावजूद भी दिखावा करते हैं।

अधिकांश फाइल सिस्टम अभी भी निर्देशिकाओं के लिए 2 + n की एक लिंक गणना की रिपोर्ट करता है, भले ही .और ..प्रविष्टियां मौजूद हों, लेकिन अपवाद हैं, उदाहरण के लिए btrfs ऐसा नहीं करते हैं।


4
..माता-पिता को इंगित करना वर्तमान निर्देशिका की लिंक गणना को प्रभावित नहीं करता है। 2 की गिनती .और निर्देशिका की (मूल) नाम सूची से ही आती है। जिस तरह से आप इसे डालते हैं वह थोड़ा अस्पष्ट है, और यह ध्वनि की तरह है .और ..दो हैं। ..केवल यह समझाने के लिए इस्तेमाल किया जाना चाहिए कि गणित कैसे काम करता है 2+n:)
th3an0maly

@ th3an0maly माता-पिता को इंगित करना माता-पिता की लिंक गणना को प्रभावित करता है। मैं वास्तव में नहीं देखता कि कैसे "प्रत्येक उपनिर्देशिका में प्रवेश" अस्पष्ट है, और मुझे समझ में नहीं आता है कि "निर्देशिका के नाम को सूचीबद्ध करने से आपका क्या मतलब है"।
गिल्स एसओ- बुराई को रोकें '

वास्तव में, यह उत्तर: unix.stackexchange.com/a/101516/160264 बिल्कुल वही है जो मुझे देखने में हर्षित हुआ है। इसे पढ़ने के बाद मैंने आपका उत्तर पढ़ा, क्योंकि आपका शीर्ष पर एक था।
th3an0maly

@ th3an0maly मुझे अभी भी पता नहीं है कि आप क्या इशारा कर रहे हैं। क्या आप इशारा करने के बजाय इसे स्पष्ट रूप से व्यक्त कर सकते हैं?
गाइल्स का SO- बुराई से रोकना '

@ गोल्डीलॉक्स का जवाब स्पष्ट है। मेरे कहने का मतलब यह है कि आपका जवाब उनके जैसा हो सकता है। लेकिन तब मैंने उसका जवाब नहीं पढ़ा था जब मैं आपका जवाब पढ़ रहा था। पहली पंक्ति बिल्कुल वही है जो मेरी मूल टिप्पणी ने कहा: "निर्देशिका के लिए एक ही है, और .इसके अंदर एक है "। यदि यह अभी भी आपके लिए स्पष्ट नहीं है, तो मुझे बहुत खेद है कि मैं आगे कोई स्पष्टीकरण देने में असमर्थ हूं। सभी मैं बेहतर कर सकता है + टिप्पणियों में यहां उसका उत्तर कॉपी + पेस्ट करें।
183 बजे th3an0maly

13

निर्देशिका के लिए एक ही है, और .इसके अंदर के लिए एक है।

वर्तमान निर्देशिका में उप-सीमाओं की संख्या भी हार्ड लिंक की संख्या के बराबर है - 2?

यह समझ में आता है, क्योंकि प्रत्येक उपनिर्देशिका एक ..हार्डलिंक बनाता है , और इसके अलावा आप निर्देशिका में हार्डलिंक नहीं बना सकते हैं। 1 हालाँकि, मैं इस पर कुछ भी गंभीर, esp के लिए भरोसा नहीं करूंगा। चूंकि उपनिर्देशिकाओं की गणना करना और वास्तविक संख्या प्राप्त करना आसान है।

यदि आप केवल lsइस बात के विचार के लिए आउटपुट को देख रहे हैं कि कितने उप-भाग हैं, तो यह आपको एक सभ्य विचार देता है।

1 या कम से कम, आप नहीं कर सकते ln। मैंने प्रोग्रामेटिक रूप से प्रयास नहीं किया है, और man 2 linkअस्पष्ट है - किसी निर्देशिका को जोड़ने के लिए कोई स्पष्ट त्रुटि नहीं है, हालांकि कुछ जोड़े हैं जो लागू हो सकते हैं ( EMLINK, EPERM)। इसलिए जब तक कि कुछ मानक न हों, जो कहते हैं कि एक निर्देशिका के लिए केवल संभव हार्ड लिंक हैं .और ..फिर से, मैं केवल उस हार्ड लिंक को एक आकस्मिक सुराग के रूप में गिनूंगा।


2
क्या निर्देशिकाओं के लिंक की अनुमति है, और क्या आप लिंक की गिनती से उपखंडों की गणना कर सकते हैं, क्या दोनों इस बात पर निर्भर हैं कि आप किस फाइलसिस्टम का उपयोग कर रहे हैं - कुछ अनुमति देते हैं, कुछ नहीं।
19

ध्यान दें कि macOS की टाइम मशीन वास्तव में पिछले बैकअप के लिए निर्देशिकाओं को हार्डलिंक करती है; इस तरह वे यह दिखावा कर सकते हैं कि प्रत्येक वृद्धिशील बैकअप एक पूर्ण प्रति है, और वे दूसरों को प्रभावित किए बिना किसी भी वृद्धि को हटा सकते हैं। यह बहुत भंगुर है, मैं नियमित सीस्कल्स का उपयोग करके इसके साथ खेल रहा था और मैंने अपने फाइलसिस्टम को अच्छी तरह से ठीक किया।
w00t
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.