Ls -l कमांड आउटपुट में फ़ाइल अनुमति और स्वामी के बीच की संख्या क्या है?


35

ls -lकमांड का आउटपुट निम्न परिणाम देता है:

यहाँ छवि विवरण दर्ज करें

फ़ाइल अनुमति और स्वामी के बीच नंबर फ़ील्ड क्या है? अर्थात वे 1, 1, 1, और 2 क्या हैं? मैंने जाँच की, --helpलेकिन वह इसकी व्याख्या नहीं करता है।

[संपादित करें] मैंने सोचा था कि यह एक निर्देशिका में फ़ाइलों की संख्या थी लेकिन यह नहीं है। छवि देखें "tempFolder" में 3 फाइलें हैं लेकिन फिर भी "2" दिखाते हैं

जवाबों:


33

नोट: @StephaneChazelas टिप्पणी के बाद संपादित किया गया

ls -lअनुमति ब्लॉक के बाद आउटपुट की पहली संख्या हार्ड लिंक की संख्या है

यह stat"लिंक" में कमांड द्वारा लौटाए गए मान के समान है ।

यह नंबर किसी फ़ाइल का हार्डलिंक काउंट होता है, जब किसी डायरेक्टरी का जिक्र करते समय किसी फाइल का जिक्र होता है या समाहित डायरेक्टरी प्रविष्टियों की संख्या।

एक फ़ाइल में आम तौर पर 1 की हार्ड लिंक गिनती होती है, लेकिन यदि हार्ड लिंक को lnकमांड के साथ बनाया जाता है तो यह बदल जाता है । डेबियन संदर्भ मैनुअल देखें ।

आपके उदाहरण में, tempFile2 के लिए एक कड़ी जोड़ने से इसकी लिंक संख्या बढ़ जाएगी:

ln -l
ln tempFile2 tempHardLink
ln -l

TempFile2 और tempHardLink दोनों की लिंक संख्या 2 होगी।

यदि आप एक प्रतीकात्मक लिंक ( ln -s tempFile2 tempSymLink) के साथ एक ही अभ्यास करते हैं , तो गिनती मूल्य नहीं बढ़ेगा।

एक निर्देशिका'.' में अपने माता-पिता की निर्देशिका में प्रविष्टि के लिए (स्वयं के लिए लिंक) और प्रविष्टि के लिए 2 की न्यूनतम गणना होगी ।

अपने उदाहरण में, यदि आप tempFolder की लिंक संख्या बढ़ाना चाहते हैं, तो एक नई निर्देशिका बनाएं और संख्या बढ़ जाएगी।

ls -l tempFolder
mkdir tempFolder/anotherFolder
ls -l tempFolder

लिंक से anotherFolder / करने के लिए tempFolder / (जो ..) गिनती के लिए जोड़ दिया जाएगा।



चूंकि यह अनुमतियों और स्वामित्व के बीच प्रदर्शित होता है, इसलिए आपको यह बहुत महत्वपूर्ण लगता है, लेकिन मैंने कभी इसका उपयोग नहीं किया। आम तौर पर इसकी आवश्यकता कब होती है?
इमानुएल बर्ग

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

@StephaneChazelas सभी दस्तावेज़ मैंने हार्ड लिंक गणना (उदाहरण के लिए, linuxgazette.net/issue35/tag/links.html ) के बारे में बात की है । साथ ही मैंने पाया कि AskUbuntu ( askubuntu.com/questions/19510/… ) में भी इसी तरह का सवाल पूछा गया था । मैं कोरुटिल्स स्रोत कोड की जांच करूंगा और देखूंगा कि क्या मैं सटीक उत्तर का पता लगा सकता हूं।
डेमियन

2
@EmanuelBerg जब फ़ाइल सिस्टम अब तक की तुलना में कम विश्वसनीय थे और आप विकसित की गई फ़ाइल सिस्टम पर काम कर रहे थे, और आप ls2 वर्ण खर्च कर सकते हैं और आपको अधिक जानकारी दे सकते हैं, और कोई stat(1)आदेश नहीं था और न find(1)ही fsck, और न ही सहानुभूति शायद इससे कहीं अधिक थी आज की तुलना में यह उपयोगी है। शेल स्क्रिप्ट्स को तोड़े बिना इसे नहीं बदला जा सकता है, जिनके लेखकों में लंबे समय तक रहा है /dev/null; यह किया गया है कि जिस तरह से के बाद से कम से कम 1979
एमएसडब्ल्यू

8

यूनिक्स पर, आम तौर पर, एक फाइल फाइलों की तालिका में कुछ प्रविष्टि होती है। विभिन्न प्रकार की फाइलें हैं: नियमित फाइलें, उपकरण, प्रतीकात्मक लिंक, दरवाजे, पाइप, सॉकेट, निर्देशिका ...

इनकोड संख्या (जिसे आप आउटपुट में देख सकते हैं ls -i) उस तालिका में अनुक्रमणिका है।

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

एक निर्देशिका एक विशेष प्रकार की फ़ाइल है जो कई संख्या में इनोड्स को नाम देती है। एक निर्देशिका प्रविष्टि एक इनोड में एक नाम से एक मानचित्रण है।

एक दी गई फ़ाइल (इनोड) में एक निर्देशिका में एक से अधिक नाम हो सकते हैं (जैसे किसी फ़ोन नंबर पर एक से अधिक नाम हो सकते हैं), और एक से अधिक निर्देशिका में नाम (प्रविष्टियाँ) भी हो सकते हैं। उन लिंक को हार्ड लिंक के रूप में भी जाना जाता है जिन्हें सॉफ्ट लिंक (एक विशेष प्रकार की फ़ाइल जो एक पथ के लिए एक संकेतक है) के साथ भेद करने के लिए कहा जाता है ।

एक फ़ाइल (इनोड) लिंक की संख्या (किसी भी निर्देशिका में प्रविष्टियों की) का ट्रैक रखता है, ताकि जब यह संख्या 0 तक पहुंच जाए (जब इसे अंतिम निर्देशिका से अनलिंक किया जा रहा हो), तो इसे हटा दिया जाता है।

वह संख्या (लिंक की संख्या) है जो ls -lआउटपुट में प्रदर्शित होती है ।

जब एक गैर-निर्देशिका फ़ाइल पहली बार (के साथ) बनाई जाती है open या creat(या bindया mknodफ़ाइलों के कुछ प्रकार के) सिस्टम कॉल के लिए), यह नई फ़ाइल (जैसे करने के लिए एक मार्ग के साथ उपलब्ध कराने के द्वारा किया जाता है "/a/b")। फिर क्या होता है एक नई फ़ाइल और इनोड आवंटित किया जाता है और रूट निर्देशिका "a"में नाम के साथ जुड़ी निर्देशिका में एक नई प्रविष्टि जोड़ी जाती है "/"। यह प्रारंभिक लिंक है इसलिए लिंक गणना एक है।

link()सिस्टम कॉल ( lnकमांड) के साथ अधिक लिंक बाद में जोड़े जा सकते हैं । और लिंक को unlink()सिस्टम कॉल ( rmकमांड) के साथ हटाया जा सकता है ।

आप देखेंगे कि टाइप डायरेक्टरी की फाइलों में आम तौर पर लिंक की संख्या 2 या उससे अधिक होती है।

अब, जब आप एक निर्देशिका बनाते हैं, तो आप mkdir()सिस्टम कॉल कर रहे हैं । कुछ इस तरह mkdir("/a/b")। फिर यह क्या करता है एक नई फाइल टाइप डायरेक्टरी आवंटित की जाती है। उस नई निर्देशिका में, यह स्वचालित रूप से दो प्रविष्टियाँ बनाता है:

  • "."( डॉट निर्देशिका के लिए )। जो अपने आप में एक कड़ी है। तो लिंक गिनती अब 1 है।
  • ".."( निर्देशिका की निर्देशिका के लिए )। जिसका लिंक है "/a"। इसलिए लिंक की गिनती "/a"एक से बढ़ कर है

फिर उस नई निर्देशिका को "/a"(इसके लिए एक प्रविष्टि जोड़ी गई "/a"है) से जोड़ा गया है , इसलिए इसकी लिंक गणना अब 2. यदि है"/a/b/c" निर्देशिका बनाई गई है, तो ".."प्रविष्टि के कारण "/a/b/c", लिंक की संख्या "/a/b"3 हो जाएगी।

अधिकांश यूनियनों ने एक निर्देशिका के आगे लिंक बनाने को प्रतिबंधित किया है क्योंकि वे समस्याग्रस्त छोरों का कारण बन सकते हैं। जब वे link()एक निर्देशिका पर अनुमति देते हैं , तो आम तौर पर केवल सुपरयुसर ही कर सकता है।

कुछ फाइलसिस्टम btrfsउस पारंपरिक निर्देशिका संरचना से प्रस्थान करते हैं। आप देखेंगे कि लिंक निर्देशिकाओं में मायने रखता हैbtrfs फ़ाइल सिस्टम हमेशा एक होते हैं, भले ही उन निर्देशिकाओं में एक "."ही इनकोड संख्या के साथ एक प्रविष्टि होती है, जिसमें वे स्वयं होते हैं।

तथ्य यह है कि लिंक की गिनती पारंपरिक रूप से 2 से अधिक है और उप-विभाजकों की संख्या में इसका उपयोग होता है। उदाहरण के लिए, इसमें:

find . -name '*.c' -print

अगर .सबडिर नहीं होते हैं, लेकिन लाखों फाइलें होती हैं। की लिंक गणना की जाँच करके ., findयह जान सकते हैं कि कोई उपखंड नहीं है। इसलिए सभी findको निर्देशिका की सामग्री को पढ़ना होगा और उन प्रविष्टियों की रिपोर्ट करनी होगी जो .c( grep '\.c$'कुछ मेगाबाइट फ़ाइल पर, कोई बड़ी बात नहीं है)। अन्यथा, findहर एक फ़ाइल के प्रकार को देखना होगा कि क्या वहाँ निर्देशिका में उतरना है (परिणामस्वरूप कई lstat()सिस्टम कॉल)। बेशक, इस तरह का अनुकूलन अभी भी आवश्यक नहीं है)।btrfs (हालांकि लिनक्स के आधुनिक संस्करणों में, फ़ाइलों के प्रकार को कुछ फाइलसिस्टम (सहित btrfs) के लिए निर्देशिका प्रविष्टि में भी संग्रहीत getdents(2)किया जाता है और प्रविष्टियों की सूची को पुनः प्राप्त करने के लिए उपयोग किए गए सिस्टम कॉल द्वारा लौटाया जाता है एक निर्देशिका में, इसलिएlstat


+1, बढ़िया उत्तर :) ls स्रोत कोड को देखकर, मैंने देखा कि स्टेट नंबर को कॉल करने के बाद स्टेटस में अपडेट किया गया था। तो स्टेट कमांड आपको फ़ाइल या डायरेक्टरी के लिए लिंक का मूल्य देगा।
डेमियन

आउटपुट -में अनुमतियों के बाद किसी भी संख्या के बजाय इसका क्या मतलब है ls -l?
शुभम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.