क्या हैं ।/ और ../ निर्देशिका?


20

सरल सवाल है, लेकिन मुझे यकीन नहीं है कि कहाँ देखना है और Google अवधि और स्लैश का जवाब नहीं देता है।

मैं सिर्फ वर्तमान निर्देशिका (सबफ़ोल्डर्स / फ़ाइलों सहित) में फ़ाइलों और निर्देशिकाओं की # गणना करने की कोशिश कर रहा हूं और अंतर करने की कोशिश कर रहा हूं ls -1 | wc -lऔर ls | wc -lचूंकि वे समान लगते हैं। एक साइट जिसे मैं देख रहा था "ध्यान रखें कि यह भी / ./ और ../ निर्देशिकाओं की गिनती कर रहा है।" के साथ एक के बारे में ls -1, और मुझे यकीन नहीं है अगर इसका मतलब है कि इसमें पहले या कुछ (जो मैं नहीं चाहता) निर्देशिका शामिल है, लेकिन यह परीक्षण से ऐसा नहीं लगता था।

क्या कोई इस बात की पुष्टि कर सकता है कि उनमें से कौन सी केवल वर्तमान निर्देशिका में # फ़ाइलों और निर्देशिकाओं की # गिनती के लिए सबसे पर्याप्त होगी (उप नहीं) और उनके द्वारा क्या मतलब है ।/ और ../ निर्देशिका?


"ध्यान रखें कि यह भी गिनती है ।/ और ../ निर्देशिका" गलत है (जब तक कि यह "और" और ".." के लिए एक टाइपो नहीं है।
vonbrand

जवाबों:


15

यूनिक्स प्रणाली की प्रत्येक निर्देशिका (और शायद हर दूसरी प्रणाली भी) में कम से कम दो निर्देशिका प्रविष्टियाँ होती हैं। ये .(वर्तमान निर्देशिका) और ..(मूल निर्देशिका) हैं। रूट डायरेक्टरी के मामले में, ये एक ही स्थान की ओर इशारा करते हैं, लेकिन किसी अन्य निर्देशिका के साथ, ये अलग हैं। आप खुद के लिए यह देखना का उपयोग कर सकते हैं stat, pwdऔर cd(लिनक्स पर) कमांड:

$ cd /
$ stat . .. bin sbin | grep Inode
Device: 802h/2050d      Inode: 2           Links: 27
Device: 802h/2050d      Inode: 2           Links: 27
Device: 802h/2050d      Inode: 548865      Links: 2
Device: 802h/2050d      Inode: 2670593     Links: 2
$ pwd
/
$ cd ..
$ pwd
/
$

ध्यान दें कि binऔर sbinप्रत्येक के पास दो लिंक हैं। एक रूट डायरेक्टरी में डायरेक्टरी एंट्री है, और दूसरा .उस डायरेक्टरी के अंदर की एंट्री है।

का उपयोग lsकरने के लिए एक पाइप के साथ wc -lls 'उत्पादन में लाइनों की संख्या की गणना के लिए एक सरल चाल है। धारणा यह है कि प्रत्येक फ़ाइल या निर्देशिका आउटपुट में ठीक एक लाइन पर कब्जा कर लेगी। GNU ls होगा, जब आउटपुट एक गैर-टर्मिनल है, तो यह स्वचालित रूप से करें; दूसरों को -1स्पष्ट रूप से व्यवहार को चालू करने के विकल्प की आवश्यकता हो सकती है । wc -lबस मायने रखता है और -lइसके इनपुट में लाइनों ( ) की संख्या को आउटपुट करता है ।

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

जब तक आप GNU ls का उपयोग कर रहे हैं, तब तक नई निर्देशिका वाले नामों के साथ कोई निर्देशिका प्रविष्टियाँ नहीं हैं, और ls(उदाहरण के लिए ls -a) के लिए कोई विषम उपनाम नहीं है , दोनों वर्तमान (या निर्दिष्ट) निर्देशिका में फ़ाइलों और निर्देशिकाओं की गिनती का उत्पादन करेंगे। ज्यादातर लोगों के लिए, यह काफी अच्छा है, लेकिन यह सामान्य मामले में मान्य नहीं है ।

यदि आपको निर्देशिका प्रविष्टि नामों में असामान्य वर्णों (मुख्य रूप से नईलाइन्स) को ठीक से संभालने की आवश्यकता है, तो मैं -bउनसे बचने के लिए ls के विकल्प का उपयोग करने का सुझाव देता हूं। ls -1bAप्रत्येक निर्देशिका प्रविष्टि नाम को अपनी लाइन पर प्रिंट करेगा, असामान्य वर्णों से बच जाएगा (इसलिए प्रत्येक निर्देशिका प्रविष्टि को एक के रूप में देखा जाएगा), जिसमें कोई भी डॉटफ़ाइल्स और -वाणिज्यिक शामिल हैं। wc -lएक संपूर्ण कमांड लाइन के लिए टैक करें ls -1bA | wc -lजो वर्तमान निर्देशिका में फ़ाइलों और निर्देशिकाओं की संख्या की रिपोर्ट करेगा (लेकिन अनदेखा करें .और ..; यह बीच का अंतर है -aऔर -A), लेकिन किसी भी उपनिर्देशिका में न उतरें। अगर आप नहीं चाहते कि कोई भी डॉटफ़ाइल्स कुल की ओर गिना जाए, तो बस -Aपैरामीटर को छोड़ दें ls


दोनों -aऔर -Aछिपी हुई फ़ाइलों के साथ-साथ मैंने महसूस किया है कि मैंने महसूस किया है कि मैं बचना चाहता हूं, इसलिए मैं सबसे ज्यादा चाहता हूं ls -b | wc -l, लेकिन यह मुझे सही जवाब देता है। क्या इस आदेश के बारे में मैं जो लाइन कॉपी और पेस्ट कर रहा हूं वह गलत है? यदि यह सही था, तो क्या मुझे 8 का आउटपुट नहीं मिल रहा है जब एक निर्देशिका में 6 फाइलें या फ़ोल्डर हैं?
एडम

@ अदम हां, कि शायद यह चाल चलेगा ("ls -b | wc -l"); आप "-1" (डैश + नंबर एक) का भी उपयोग कर सकते हैं, जो एक पंक्ति में सभी के बजाय एक एकल कॉलम में लिस्टिंग को मजबूर करता है, लेकिन ऐसा तब भी होता है जब किसी अन्य कमांड को पाइप करते हैं। तो (imho) मैं इसे "ls -1b | wc -l" के रूप में छोड़ूंगा; और "परीक्षण" करने के लिए, "ls -1b" चलाएं और लाइनों की संख्या की गणना करें, फिर "ls -1 | wc -l" चलाएँ और परिणामों को सत्यापित करें। (यह है कि कैसे डिबग / टेस्ट पाइप।)
माइकल

@ सारथ्रियन, कि अक्सर पूछे जाने वाले प्रश्न काफी भ्रामक हैं। यूनिक्स फाइल सिस्टम कन्वेंशन "अजीब" नहीं हैं; जहां वे आम हैं, यह दूसरी प्रणाली है जो उन्हें उठा रही है। लेकिन ठीक है। फिर यह कहता है कि "फ़ाइल कमांड जादू की संख्याओं की पहचान करने के लिए उपयोग करता है ...", जो गलत है: यह बहुत सारे उत्तराधिकारियों का भी उपयोग करता है। मेरी पुस्तक में बहुत विश्वसनीय नहीं है।
वॉनब्रांड

@vonbrand: काफी उचित, लिंक हटा दिया गया। मैंने इसे स्किम किया और यह ठीक लगा। मुझे पता है कि मुझे वह मिल गया जो अच्छा था लेकिन अब याद नहीं आ रहा है कि वह कहाँ था।
सरदारथियन - मोनिका

1
आप गलत कर रहे हैं: । और .. 1970 के दशक में UNIX से ऐतिहासिक कलाकृतियाँ हैं और एक समय से परिणाम है जब mkdir()अभी तक कोई सिस्टम कॉल नहीं था। सभी फाइलसिस्टम उनके पास नहीं हैं और उन्हें POSIX की आवश्यकता भी नहीं है और न ही आवश्यक है।
विद्वान

6

विषय में प्रश्न का उत्तर देने के लिए:

जब एक निर्देशिका B को यूनिक्स में बनाया जाता है, तो इसे एक अन्य निर्देशिका A (इसकी मूल निर्देशिका) में एक नई प्रविष्टि के रूप में जोड़ा जाता है, और B में दो प्रविष्टियाँ जोड़ी जाती हैं: एक .को स्वयं के लिए एक कड़ी कहा जाता है, और एक ..को एक हार्ड कहा जाता है। ए के लिए लिंक

अनुमत निर्देशिकाओं के लिए वे केवल कड़ी हैं (हालांकि कुछ यूनियनों के पुराने संस्करणों ने भी मनमाने ढंग से लिंक की अनुमति दी थी)।

यही कारण है कि अधिकांश फ़ाइल सिस्टम ( btrfsएक उल्लेखनीय अपवाद होने के साथ), linksएक निर्देशिका की संख्या इस बात का संकेत है कि इसमें कितनी उपनिर्देशिकाएँ हैं (उनकी ..प्रविष्टियों के लिए लेखांकन )।

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

हालांकि सावधान: /a/b/../cके रूप में ही नहीं हो सकता है /a/cक्योंकि /a/bएक हो सकता है प्रतीकात्मक कुछ अन्य निर्देशिका के लिए लिंक।

इसका एक अपवाद तब है जब उस मार्ग को cdकमांड को कुछ गोले दिए जाते हैं। वे निर्देशिकाओं में प्रविष्टियों की अनदेखी कर तार्किक रूप सेcd व्यवहार करते हैं । एक कारण है कि आप अक्सर ठीक से लिखी गई स्क्रिप्ट में देखते हैं, उस सुविधा को अक्षम करने के लिए जो अन्यथा भ्रम और विसंगतियों का कारण बन सकती है।.. ..cd -P

वर्तमान निर्देशिका को छोड़कर .और ..साथ में प्रविष्टियों की संख्या की गणना करने के लिए bash, आप यह कर सकते हैं:

shopt -s nullglob dotglob
set -- *
echo "$#"

Zsh के साथ:

f=(*(ND))
echo $#f

portably:

find . ! -name . -prune -print | grep -c /

मैं थोड़ा उलझन में हूँ; आपके द्वारा सूचीबद्ध सभी तीन वास्तविक गणना में एक जोड़ते हैं। उदाहरण के लिए, अगर मेरे पास एक निर्देशिका में 6 फाइलें या फ़ोल्डर हैं, तो वे 7 का उत्पादन करते हैं, 6. नहीं। मेरे लिए, ऐसा लगता ls | wc -lहै कि केवल एक ही बाहर है .और..
एडम

1
@ एडम, lsछिपी हुई फाइलों की सूची नहीं देता है। आप ls -Aउन लोगों के रूप में ही पाने की जरूरत है। यदि आप छिपी हुई फ़ाइलों को गिनना नहीं चाहते हैं, तो dotglob(bash के लिए) या D(zsh के लिए) बंद करें या ! -name '.*'पहले के -printलिए जोड़ें find
स्टीफन चेज़लस

हाँ, मैंने वास्तव में फाइलों को सूचीबद्ध करने के बाद इस पर ध्यान दिया। क्या आप जानते हैं कि फिर ls | wc -lभी मुझे सही उत्तर क्यों दिया जाता है और छिपी हुई फाइलों को शामिल नहीं किया जाता है, .और ..?
एडम

1
एडम, अपने निर्देशिका में, आपके पास ., ..और एक अन्य फ़ाइल जिसका नाम के साथ शुरू होता .है जो ls द्वारा सूचीबद्ध नहीं है, लेकिन द्वारा किया जाएगा ls -A। तो ls | wc -lयह आपको सही उत्तर नहीं देता है क्योंकि यह उस छिपी हुई फ़ाइल की गिनती नहीं कर रहा है।
स्टीफन चेज़लस

1
हां, .और ..छिपी हुई फाइलें हैं क्योंकि वे एक से शुरू करते हैं .। यहां तक ​​कि एक किंवदंती भी है जो बताती है कि डॉटफ़ाइल्स दुर्घटना से छिपे हुए हैं, क्योंकि इसे जल्दी लागू करने का lsमतलब केवल .और केवल बाहर करना था .., लेकिन एक बग था जिसके कारण शुरू होने वाली किसी भी फ़ाइल को बाहर करना पड़ा .ls | wc -lयदि फ़ाइल नाम में नए वर्ण नहीं हैं तो काम नहीं करता है।
स्टीफन चेज़लस

1

मैं एक महान लिनक्स विशेषज्ञ नहीं हूं, लेकिन मुझे पता है कि लिनक्स (16 साल पहले प्रशासक हुआ करता था, स्लैकवेयर :) अच्छे पुराने समय पर

.// और ../ निर्देशिका यह सरल है:। वर्तमान निर्देशिका है, पिछली निर्देशिका है (pwd -local निर्देशिका कमांड के पेड़ में-

यदि यह उन्हें गिनता है, तो मुझे लगता है कि वे लिस्टिंग के कुल में 2 जोड़ते हैं, वास्तव में पुनरावर्ती नहीं जाते हैं और वर्तमान एक के नीचे निर्देशिका की गिनती करते हैं, और वर्तमान निर्देशिका (।) :) को भी फिर से गिनते हैं।

इसलिए मूल रूप से मुझे लगता है कि यह वर्तमान निर्देशिका में पहले से ही गणना (फ़ाइलों) के लिए मान 2 जोड़ता है।

अगर मैं गलत हूं तो कोई भी मुझे सुधार लेगा।

मैं बस मदद करने के लिए पोस्ट कर रहा हूं और देखा कि किसी ने यहां इस सवाल का जवाब नहीं दिया, वे व्यस्त हो सकते हैं। लेकिन बस प्रयोग करें और देखें कि क्या आपके पास 10 फाइलें हैं और 12 की गिनती हो रही है।


हां, एड्रियन सही है:। वर्तमान dir है और .. पदानुक्रम में तुरंत ऊपर की निर्देशिका है।
schaiba

.. हमेशा पेड़ में पिछली निर्देशिका को संदर्भित नहीं करता है: "/" में .. वर्तमान निर्देशिका को भी संदर्भित करता है।
बोंसी स्कॉट

क्योंकि आप फाइल सिस्टम के मूल में हो सकते हैं?
एड्रियन तानसे

यदि यह एक निर्देशिका में दो से # फ़ाइलों को जोड़ता है, तो मुझे ओएक्सएक्स पर टर्मिनल में परीक्षण करते समय सही उत्तर क्यों मिल रहा है? उदाहरण के लिए 6 फाइलों या फ़ोल्डरों के साथ एक निर्देशिका 6 का उत्पादन करेगी, 8 नहीं जब मैं करूंगाls | wc -1
एडम

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