UNIX में केवल निर्देशिका सूचीबद्ध करना


219

मैं केवल निर्दिष्ट पथ में निर्देशिकाओं को सूचीबद्ध करना चाहता हूं ( lsऐसा कोई विकल्प नहीं है)। इसके अलावा, क्या यह एकल पंक्ति कमांड के साथ किया जा सकता है?


12
भविष्य के लिए: इतनी मेहनत प्रोग्रामिंग से संबंधित नहीं सवालों का हो सकता है कि यूनिक्स / लिनक्स मूल बातें प्रकार वहाँ बेहतर keept हैं: unix.stackexchange.com
echox

जवाबों:


315

ls -d */वर्तमान निर्देशिका के भीतर निर्देशिकाओं को सूचीबद्ध करने का प्रयास करें


17
अरे, यह बहुत बुरा है, मैं हमेशा हमारे लिए इस्तेमाल किया ls -al | grep '^d'- यह बहुत अधिक रसीला है।
paxdiablo

43
क्यों उपयोग * / ?? कृपया समझाएँ!?
चंदीप

6
मैं एक उचित स्पष्टीकरण की जरूरत नहीं है, फिर भी मैं पता चलेगा कि */बलों केवल एक फ़ॉर्वर्ड स्लैश, जो इस मामले में एक निर्देशिका होगा के साथ समाप्त भले ही आइटम के प्रदर्शन -Fका विकल्प lsनहीं किया जाता है। के व्यवहार के समान है ls *phpऔर यह कैसे phpएक निर्देशिका में समाप्त होने वाली सभी फाइलों को प्रदर्शित करता है ।
डेविड हैनकॉक

3
@ user975234 किसी ने इसी तरह का सवाल पूछा, और एक बहुत अच्छी व्याख्या पोस्ट की गई लिंक है
user1766760

17
बस echo */भी ऐसा ही करेंगे
nos

95

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

find . -maxdepth 1 -type d

8
मेरे लिए यह ऐसा होना चाहिए जिस तरह से होना चाहिए। सुझाए गए lsसमाधानों के विपरीत , findकेवल काम करने के लिए ज़िम्मेदार है (शेल वाइल्डकार्ड विस्तार पर निर्भर नहीं है, जो सीमाएं लगा सकता है)। यह भी एक बहुत अधिक संक्षिप्त है।
पीपर

1
इसके बारे में बुरी बात यह है कि यदि आप परिणामों के माध्यम से लूप करने की कोशिश कर रहे हैं तो यह काम नहीं करता है और आपके परिणामों के नामों में स्थान हैं।
ubiquibacon

2
वैकल्पिक रूप से, यदि आप निर्देशिका को स्वयं शामिल नहीं करना चाहते हैं find * -maxdepth 0 -type d:।
जेम्स को

या तो उपयोग @ubiquibacon findकी -print0या -execविकल्प।

1
यह वास्तव में धीमा है, कम से कम मेरे मैक पर। यह पूरी तरह से पुनरावर्ती खोज करने के लिए लगता है जो findआमतौर पर केवल फ़ोल्डर्स को गहराई से आउटपुट करता है 1.
कारा ब्राइटवेल

22

निम्नलिखित

find * -maxdepth 0 -type d

मूल रूप से '*' के विस्तार को फ़िल्टर करता है, अर्थात वर्तमान dir में सभी प्रविष्टियाँ, -type dशर्त द्वारा ।

लाभ यह है कि, आउटपुट समान है ls -1 *, लेकिन केवल निर्देशिकाओं और प्रविष्टियों के साथ डॉट के साथ शुरू नहीं होता है


13

आप उपयोग कर सकते हैं ls -d */याtree -d

एक और समाधान ग्लोबिंग होगा लेकिन यह उस शेल पर निर्भर करता है जिसका आप उपयोग कर रहे हैं और यदि निर्देशिका के लिए ग्लोबिंग समर्थित है।

उदाहरण के लिए ZSH:

zsh # ls *(/)

3
यूनिक्स के किस स्वाद के साथ आप प्राप्त करते हैं tree?
जॉन्सवेब सिप

उदाहरण के लिए सभी प्रमुख linux distries? क्षमा करें, मुझे प्रश्न नहीं मिला?
इकोक्स

1
मेरे पास एक डेबियन डिस्ट्रो है, और treeडिफ़ॉल्ट रूप से स्थापित नहीं है (हालांकि यह रिपॉजिटरी में है)।
स्टीफन श्रुगर 20

1
डाउनवोट्स के रूप में मेरा मानना ​​है कि treeकमांड एक देशी यूनिक्स कमांड नहीं है (कृपया मुझे सही करें अगर मैं गलत हूं)।
टिआगो कार्डसो

10

चूंकि इसे करने के दर्जनों तरीके हैं, यहाँ एक और है:

tree -d -L 1 -i --noreport
  • -d: निर्देशिका
  • -L: वृक्ष की गहराई (इसलिए 1, हमारी कार्यशील निर्देशिका)
  • -i: कोई इंडेंटेशन नहीं, केवल नाम प्रिंट करें
  • --noreport: ट्री लिस्टिंग के अंत में जानकारी दर्ज न करें

और स्विच को समझाने के लिए धन्यवाद। स्टैक ओवरफ्लो उत्तर के बारे में है, मैं हमेशा सराहना करता हूं जब लोग आपको स्पष्टीकरण के साथ पसंद करते हैं बनाम "बस आदमी की प्रविष्टि पढ़ें!" <- यह एक जवाब नहीं है।
फ्यूजन

लाइन 2 से शुरू करने के लिए (केवल डॉट के साथ लाइन छोड़ें):tree -d -L 1 -i --noreport | tail -n +2
adius

यह उच्चतम श्रेणी का समाधान है जो सॉफ्ट-लिंक्ड निर्देशिकाओं को सूचीबद्ध करता है और एक उपयोगी तरीके से करता है, उन्हें लिंक के रूप में उजागर करता है। मैं भिन्नता पसंद करता हूं:tree -C -d -L 1 -i --noreport | tail -n+2
एमन हारेल

9
ls -l | grep '^d'

आप एक उपनाम बना सकते हैं और इसे प्रोफ़ाइल फ़ाइल में डाल सकते हैं

alias ld="ls -l| grep '^d'"

1
इस आदेश के साथ लिंक नहीं देखे गए हैं। और एक लिंक एक फ़ाइल या एक निर्देशिका हो सकती है। उदाहरण: lrwxrwxrwx 1 मूल जड़ 21 avril 15 17:38 cron -> / lib / init / upstart-job।
c-tocaca


6

वर्तमान कार्यशील निर्देशिका में निर्देशिकाओं को सूचीबद्ध करने के लिए ls -d */उपयोग किया जा सकता है। और यदि आपको छिपी हुई निर्देशिकाओं को सूचीबद्ध करने की आवश्यकता है तो इस कमांड का उपयोग करें ls -d .*/


6

निर्देशिका की सूची प्राप्त करने के लिए इसका उपयोग करें

ls -d */ | sed -e "s/\///g"

ls -d <custom-directory-path> | sed -e "s / \ /// g" काम नहीं कर रहा है .. कोई सुराग नहीं?
धवनित

धन्यवाद! मैं बस सभी अनुमतियों के बिना निर्देशिका सूची चाहता था और इसने चाल चली। :)
कोडिंगजेरेमी

5

find specifiedpath -type d

यदि आप उपनिर्देशिकाओं में पुनरावृत्ति नहीं करना चाहते हैं, तो आप इसके बजाय यह कर सकते हैं:

find specifiedpath -type d -mindepth 1 -maxdepth 1

ध्यान दें कि "डॉट" निर्देशिका (जिसका नाम शुरू होता है .) को भी सूचीबद्ध किया जाएगा; लेकिन नहीं विशेष निर्देशिका .है और न ही ..। यदि आप "डॉट" निर्देशिका नहीं चाहते हैं, तो आप grepउन्हें बाहर निकाल सकते हैं:

find specifiedpath -type d -mindepth 1 -maxdepth 1 | grep -v '^\.'


1
mindepthसे छुटकारा पाने के लिए उल्लेख के लिए Upvote .! 😁
adius

5

उत्तर आपके शेल पर निर्भर करेगा ।

में zsh, उदाहरण के लिए, आप निम्न कर सकते हैं:

echo *(/)

और वर्तमान कार्यशील निर्देशिका के भीतर सभी निर्देशिकाओं को प्रदर्शित किया जाएगा।

man zshexpnअधिक जानकारी के लिए देखें ।

एक वैकल्पिक दृष्टिकोण का उपयोग करना होगा find(1), जो अधिकांश यूनिक्स स्वादों पर काम करना चाहिए:

find . -maxdepth 1 -type d -print  

find(1)कई उपयोग हैं, तो मैं निश्चित रूप से सिफारिश करेंगे man find


4

इसे पूरा करने के लिए आप treeइसके dस्विच के साथ कमांड का उपयोग कर सकते हैं ।

% tree -d tstdir
tstdir
|-- d1
|   `-- d11
|       `-- d111
`-- d2
    `-- d21
        `-- d211

6 directories

man treeअधिक जानकारी के लिए देखें ।


मैं नीचे नहीं था, बस एक ही सवाल था। ऐसा प्रतीत होता है कि आपका उत्तर इकोक्स का धोखा है, शायद इसीलिए।
लुई वावेरू

1
@ लुईस - धन्यवाद, मैंने कभी भी उनके उल्लेख पर ध्यान नहीं दिया tree। ओह ठीक है, किसी की गड़गड़ाहट चोरी करने का मेरा इरादा नहीं था।
SLM

पेड़ क्या करता है, इसके दृश्य के लिए upvoting
'31

मेरा मानना है कि downvotes हैं, क्योंकि यह के रूप में एक ही जवाब है stackoverflow.com/a/3667405/523742
टैगो कार्डोसो

@TiagoCardoso - खान 2 साल से एक की भविष्यवाणी करता है।
slm

2

अगर मेरे पास यह निर्देशिका है:

ls -l

lrwxrwxrwx  1 nagios nagios     11 août   2 18:46 conf_nagios -> /etc/icinga
-rw-------  1 nagios nagios 724930 août  15 21:00 dead.letter
-rw-r--r--  1 nagios nagios  12312 août  23 00:13 icinga.log
-rw-r--r--  1 nagios nagios   8323 août  23 00:12 icinga.log.gz
drwxr-xr-x  2 nagios nagios   4096 août  23 16:36 tmp

सभी निर्देशिकाएं प्राप्त करने के लिए, लिंक को हल करने के लिए -L का उपयोग करें:

ls -lL | grep '^d'

drwxr-xr-x 5 nagios nagios   4096 août  15 21:22 conf_nagios
drwxr-xr-x 2 nagios nagios   4096 août  23 16:41 tmp

बिना -L:

ls -l | grep '^d'

drwxr-xr-x 2 nagios nagios   4096 août  23 16:41 tmp

conf_nagios निर्देशिका अनुपलब्ध है।


2
### If you need full path of dir and list selective dir with "name" of dir(or dir_prefix*):
find $(pwd) -maxdepth 1 -type d -name "SL*"

1

यह मेरे लिए काम कर रहा है:

`ls -F | grep /`

(लेकिन, मैं echo */@nos द्वारा बताए अनुसार स्विच कर रहा हूं)


1

यहां एक और समाधान है जो लिंक्ड निर्देशिकाओं को दिखाता है। मैं इसे थोड़ा पसंद करता हूँ क्योंकि यह "सामान्य" ls -l आउटपुट का सबसेट है:

ls -1d */ | rev | cut -c2- | rev | xargs ls -ld --color=always

1

बैश में:

ls -d */

सभी निर्देशिकाओं को सूचीबद्ध करेगा

ls -ld */

सभी निर्देशिकाओं को लंबे रूप में सूचीबद्ध करेगा

ls -ld */ .*/

छिपी निर्देशिकाओं सहित सभी निर्देशिकाओं को लंबे रूप में सूचीबद्ध करेगा।


मैंने हाल ही में zsh (MacOS कैटालिना) पर स्विच किया है, और पाया कि:

ls -ld */ .*/

यदि वर्तमान निर्देशिका में कोई छिपी हुई निर्देशिका नहीं है तो कोई काम नहीं करता है ।

zsh: no matches found: .*/

यह उपरोक्त त्रुटि प्रिंट करेगा, लेकिन किसी भी निर्देशिका को प्रिंट करने में विफल होगा।

ls -ld *(/) .*(/)

साथ ही उसी तरह से फेल हो जाता है।

अब तक मैंने पाया है कि यह:

ls -ld */;ls -ld .*/

एक अच्छा काम है। ;एक कमांड विभाजक है। लेकिन इसका मतलब यह है कि अगर कोई छिपी हुई निर्देशिका नहीं है, तो यह निर्देशिकाओं को सूचीबद्ध करेगा, और फिर भी छिपी हुई निर्देशिकाओं के लिए त्रुटि को प्रिंट करेगा:

foo
bar
zsh: no matches found: .*/

lsवर्तमान निर्देशिका की सूची सामग्री के लिए शेल कमांड
-lहै यह निर्दिष्ट करने के लिए कि आप लॉन्गफ़ोर्ड (एक आइटम प्रति पंक्ति + एक अन्य ठंडी जानकारी का एक गुच्छा)
-dमें सूचीबद्ध करना चाहते हैं, सभी निर्देशिकाओं को "फाइलों के रूप में" सूचीबद्ध करने के लिए झंडा है और पुनरावृत्ति नहीं
*/है तर्क 'एक स्लैश में समाप्त होने वाली सभी फ़ाइलों की सूची'
*"कुछ भी" के लिए एक सरल रेगेक्स कमांड है, इसलिए */शेल को "/ 'में समाप्त होने वाली किसी भी चीज़ को सूचीबद्ध करने के लिए कह रहा है।

man lsअधिक जानकारी के लिए देखें ।


मैंने इसे रखा:

alias lad="ls -ld */;ls -ld .*/"

मेरे .zshrc में, और यह ठीक काम करने लगता है।

नोट: मैंने यह भी पता लगाया है

ls -ld .*/ 2> /dev/null

काम नहीं करता है, क्योंकि यह अभी भी टर्मिनल को sterr प्रिंट करता है। मैं अपना जवाब अपडेट करूंगा कि क्या / जब मुझे कोई समाधान मिल जाए।


0

du -d1शायद सबसे छोटा विकल्प है। (जब तक आपको किसी अन्य कमांड में इनपुट को पाइप करने की आवश्यकता नहीं है।)


0

एक निर्दिष्ट पथ में केवल निर्देशिकाओं को सूचीबद्ध करने के लिए, बस ls -l टाइप करें grep drw


इसमें फ़ाइलें शामिल हो सकती हैं, यदि कोई फ़ाइल नाम शामिल है drw, और किसी भी निर्देशिका को शामिल नहीं करेगा जो स्वामी-पठनीय और लिखने योग्य नहीं है। grep ^dबेहतर काम करता है।
टॉम ज़िक सिप

0

निर्देशिकाओं की लंबी सूची

  • ls -l | grep '^ d'
  • ls -l | grep "^ d"

लिस्टिंग निर्देशिका
- ls -d * /


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