कमांड 'ls -d' निर्देशिका प्रदर्शित नहीं कर रहा है। क्या फाइलों और निर्देशिकाओं के बजाय केवल निर्देशिका प्रदर्शित करने के लिए 'ls' प्राप्त करने का एक तरीका है?


44

क्या lsफ़ाइलों और निर्देशिकाओं के बजाय केवल प्रदर्शन निर्देशिकाओं को प्राप्त करने का एक तरीका है ?

मैन पेज से:

   -d, --directory
          list directory entries instead of contents, and do not  derefer
          ence symbolic links

इसलिए यदि मैं इसे /निर्देशिका में टाइप करता हूं तो मुझे केवल निर्देशिका देखने की उम्मीद है। इसके बजाय यह दिखाता है "।"

$ cd /
$ ls -d
.

ls -dमुझे यह दिखाने की उम्मीद थी :

$ ls -d
bin    data  home        opt    sbin  sys      var
boot   dev   lib         media  proc  selinux  tmp
cdrom  etc   lost+found  mnt    root  srv      usr

क्या lsफ़ाइलों और निर्देशिकाओं के बजाय केवल प्रदर्शन निर्देशिकाओं को प्राप्त करने का एक तरीका है ?


17
lsd बहुत भ्रामक हो सकता है।
बोहज

2
@जिन ls -d * / काम करता है। लेकिन मुझे अपनी पसंद के अनुसार बाहर निकलने के लिए "* /" क्यों करना पड़ता है।
नेलारो

8
@ लाइनर का -dमतलब केवल निर्देशिकाओं को सूचीबद्ध करना नहीं है, इसका मतलब निर्देशिका सामग्री को सूचीबद्ध नहीं करना है। टाइप करने का प्रयास करें ls */और आप सभी निर्देशिकाओं की सामग्री देखेंगे।
जिन

2
मैं है ldirकरने के लिए alised ls -d */मेरे में .bashrcबनाने के लिए आसान ... इस
DQdlM

1
ls आपको सूचनाओं के टन दे सकता है, लेकिन केवल एक निर्देशिका दिखाने के लिए एक झंडा नहीं ...
DimiDak

जवाबों:


50

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

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

ls *

शेल से lsस्वयं को क्या प्राप्त होता है (कुछ ऐसा है)

ls बिन घर ऑप्ट var बूट देव tmp आदि खो + रूट usr मिला

जो -d/ --directoryविकल्प करता है वह बंद हो जाता है जो आम तौर पर आगे होता है । आम तौर पर आगे क्या होता है ls, इसके प्रत्येक तर्क को बारी-बारी से देखता है, देखता है कि वे निर्देशिका हैं, और अपनी सामग्री को एन्यूमरेट करने का निर्णय लेते हैं। फ़ाइलों को नाम देने वाले तर्कों के लिए, यह केवल फ़ाइल के लिए जानकारी प्रिंट करता है। -dविकल्प के साथ , निर्देशिकाओं को फ़ाइलों की तरह ही व्यवहार किया जाता है। तो lsप्रत्येक निर्देशिका के लिए जानकारी को प्रिंट करता है जो कि उसके तर्कों के रूप में पारित हो जाती है, जैसे कि यदि वे फाइलें थीं तो यह करेंगे।

तो -d नहीं है एक "केवल निर्देशिका प्रिंट" विकल्प। वास्तव में, न केवल ऐसा कोई विकल्प है; वहाँ नहीं हो सकता इस तरह के एक विकल्प। वाइल्डकार्ड का विस्तार शेल द्वारा किया जाता है, और (POSIX shमें कम से कम) शेल को अनुमति की जांच करने और बिट्स टाइप करने की कोई विधि नहीं है जब यह *नामों की सूची में फैलता है । अकेले निर्देशिकाओं के नामों की सूची प्राप्त करने के लिए, या तो findकमांड का उपयोग करना आवश्यक है , जैसा कि समझाया गया है ztank1013, या उस चाल का उपयोग करने के लिए जो स्लैश के साथ समाप्त होने वाला मार्ग निर्देशिका प्रविष्टि का अर्थ है ., जैसा कि समझाया गया है Jin। ( Jin'' ट्रिक lsकमांड प्राप्त करने के साथ तर्कों को समाप्त करता है

ls बिन / घर / ऑप्ट / var / बूट / देव / tmp / etc / खो + पाया / जड़ / usr /

क्योंकि पैटर्न */वास्तव में दो घटकों के साथ मेल खाने वाले पथनामों में है, दूसरा खाली है, और इसलिए ऐसा नहीं है जो वांछित था। विशेष रूप से, यह निर्देशिकाओं की ओर इशारा करते हुए प्रतीकात्मक लिंक का इलाज करेगा जैसे कि वे निर्देशिका थे।)

ls -dबिना किसी के व्यवहार के *ऊपर का एक सरल विस्तार है। बस इसके बारे में एक और बात जाननी होगी ls: जब इसे कोई तर्क नहीं दिया जाता है, तो यह एक डिफ़ॉल्ट तर्क मानता है .। अब बिना-d विकल्प, द्वारा नामित निर्देशिका की सामग्री के लिए ऊपर उल्लिखित व्यवहार होता है .प्रगणित किया जा रहा है और इसकी सामग्री के लिए जानकारी का प्रदर्शन किया। साथ-d विकल्प, निर्देशिका .व्यवहार किया जाता है बस के रूप में अगर यह एक फ़ाइल थे, और अपने स्वयं के बारे में जानकारी प्रदर्शित किया जाता है, न कि उसकी सामग्री को प्रगणित।


3
" ऐसा कोई विकल्प नहीं हो सकता है" - यह एक मजबूत कथन है - इस तरह के विकल्प का कार्यान्वयन स्पष्ट है: एक गैर-निर्देशिका तर्क देखें और इसे अनदेखा करें। क्या लागू नहीं किया जा सकता है dir /s *.txt[के लिए वाइल्डकार्ड उद्धृत करने के लिए सहारा के बिना] के
बराबर है

6
सही है, लेकिन कोई तार्किक कारण नहीं है ls में एक विकल्प नहीं हो सकता है जो उन मदों को फ़िल्टर करेगा जो तर्क के रूप में पारित किए गए थे। तथ्य यह है कि "वाइल्डकार्ड विस्तार को एंट्री टाइप चेकिंग से तलाक दिया गया है" अप्रासंगिक है, क्योंकि वाइल्डकार्ड विस्तार से इसका कोई लेना- देना नहीं है - केवल एंट्री टाइप चेकिंग, जिसका कोई कारण नहीं है कि यह पूरी तरह से ls के भीतर नहीं किया जा सकता है । यदि ls --color उन्हें नीला कर सकता है, ls -F उनके बाद a / लगा सकता है, और ls -l मोड में 'd' डाल सकता है, तो कुछ अन्य काल्पनिक विकल्प उन्हें छोड़ सकते हैं। ऐसा कोई विकल्प मौजूद नहीं है, इसका मतलब यह नहीं है कि यह " नहीं " हो सकता है
रैंडम 832

5
Random832 एक सभ्य बिंदु बनाता है: फ़ाइलों या निर्देशिकाओं को फ़िल्टर करने का विकल्प ls हो सकता है, और यह शेल के विस्तार के साथ पारस्परिक रूप से अनन्य नहीं है। एलएस के भीतर कोई दौड़ की स्थिति नहीं है: यह इसे फ़िल्टर कर सकता है क्योंकि यह फाइलों को सामान्य रूप से चित्रित करता है। (शेल विस्तार और ls, FWIW के बीच पहले से ही एक दौड़ है।) मुझे लगता है कि शेल का विस्तार केवल कारण का हिस्सा है: शेल विस्तार (और सामान्य रूप से फ़िल्टर करना) ls में लागू नहीं होता है क्योंकि इसे cp में फिर से लागू करने की आवश्यकता होती है , एमवी, आदि यूनिक्स एक "एक काम करो और इसे अच्छी तरह से करो" है। यदि आपको उन्नत फ़िल्टरिंग की आवश्यकता है, तो उसके लिए उपकरण हैं।
थानाटोस

2
ls -pविकल्प के लिए एक कहते हैं /केवल निर्देशिकाओं के प्रतीक। कोई कारण नहीं है कि आउटपुट प्रिंटिंग क्षमताओं को उस चीज़ से बढ़ाया जाए जो केवल इनका उत्पादन करती है (इसके बजाय ls -p | grep /)।
ऐनी वैन रोसुम

3
@ जेडीबीपी, विज्ञापन-होमिनम हमले ("किद्दो") और अहंकार (आपके अलावा हर कोई "यूनिक्स के मूल सिद्धांतों" को नहीं जानता है) तकनीकी चर्चा से संबंधित नहीं है। इसके अलावा, आप एक पुआल आदमी को खींच रहे हैं जब आप तर्क देते हैं कि एक कमांड विकल्प शेल द्वारा किए गए वाइल्डकार्ड विस्तार को नियंत्रित नहीं कर सकता है। बेशक, यह नहीं कर सकता! न तो रैंडम 832, न ही थानाटोस और न ही ऐनी वैन रोसुम, और यहां तक ​​कि सवाल भी किसी भी तरह से वाइल्डकार्ड का उल्लेख नहीं करता है। आपत्ति थी कि ls --only-directories .विकल्प को lsअंततः जोड़ा जा सकता है ।
mkalkov

30

आप उपयोग कर सकते हैं ls -d */, या ls -d .*/छिपी निर्देशिकाओं के लिए।


/ का उपयोग कर चालाक चाल!
मोनो

हाँ यह अच्छा है। क्या कोई ऐसा मामला है जहां यह काम नहीं करता है?
आइरिन

5
एक पंक्ति में उत्तर प्रदान करने के लिए +1। मैं अनुमान लगा रहा हूँ कि इसका उत्तर भी कहीं न कहीं है।
कलन नाइट नाइट

निर्देशिका में पहले से मौजूद न होकर आप इसे स्क्रिप्ट में कैसे उपयोग कर सकते हैं?
दिमिदाक

13

इसे इस्तेमाल करे

 find . -mindepth 1 -maxdepth 1 -type d

अपने वर्तमान स्थान के तहत सिर्फ निर्देशिका प्राप्त करने के लिए।


5

शयद आपको भी ये अच्छा लगे

tree -d 

जो बड़े करीने से पेड़ की संरचना के चित्रमय चित्रण के साथ सभी निर्देशिकाओं और उपनिर्देशिकाओं को सूचीबद्ध करता है।


3
और केवल एक स्तर गहरे के लिए:tree -dL 1
ऐनी वैन रोसुम

दुर्भाग्य से आप पेड़ के साथ ज्यादा गठबंधन नहीं कर सकते। # पेड़ -डी | grep wc -l (मानक इनपुट)
डिमीडैक

5

यदि आप केवल विस्तृत विवरण जैसे ls -l(ईएलएल) विकल्प देखना चाहते हैं तो आप नीचे उपयोग कर सकते हैं:

find -maxdepth 1 -type d -ls;

ऊपर आपको केवल वह -lविकल्प दिया जाएगा जैसे आप विकल्प के साथ प्राप्त करते हैं ।


1
find -maxdepth 1 -type d -exec ls -d {} +सामान्य lsप्रारूप में आउटपुट प्राप्त करने के लिए उपयोग करना और भी बेहतर हो सकता है ।
mkalkov

4

यदि आप दूसरी तरह से काम करना चाहते हैं, तो यह प्रयास करें:

ls -l | grep ^d

हालांकि इस स्थिति में एक एकल उपकरण पर्याप्त है। पाइप लाइन हमेशा आपकी मदद के लिए होती है। मुझे लिनक्स में लचीलापन पसंद है, जो मैं चाहता हूं कि आप करें।


1
यह निर्देशिकाओं से अधिक को फ़िल्टर करने वाला है।
ओसोडो

2
@Slomojo, यह सब कुछ लेकिन निर्देशिकाओं को फ़िल्टर करेगा। आप क्या मतलब था?
mkalkov

हाँ, आपको -l (लंबे) की आवश्यकता है ताकि अनुमतियाँ रेखा के ऊपर जाएँ। निर्देशिका के लिए "d"। इसके अलावा आपको एक निर्देशिका प्रविष्टि की "लंबी" सूची मिलती है जो अच्छी है।
5

1

मुझे उम्मीद है कि यह आपकी आवश्यकता को ठीक करेगा। नीचे दिए गए कमांड केवल दिए गए मार्ग में निर्देशिकाओं को सूचीबद्ध करेंगे।

ls -F <path> | grep /

उदाहरण:

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