एक विशिष्ट निर्देशिका में निर्देशिकाओं की संख्या की गिनती


103

किसी विशिष्ट निर्देशिका में फ़ोल्डर्स की संख्या की गणना कैसे करें। मैं निम्नलिखित कमांड का उपयोग कर रहा हूं, लेकिन यह हमेशा एक अतिरिक्त प्रदान करता है।

find /directory/ -maxdepth 1 -type d -print| wc -l

उदाहरण के लिए, यदि मेरे पास 3 फ़ोल्डर हैं, तो यह कमांड 4 प्रदान करता है। यदि इसमें 5 फ़ोल्डर हैं, तो कमांड 6. प्रदान करता है। वह क्यों है?


4
वर्तमान निर्देशिका के कारण अतिरिक्त 1 गिनती है। '' , जिसे 'खोज' द्वारा भी ध्यान में रखा जाता है।
पटेल

जवाबों:


94

find स्वयं निर्देशिका भी प्रिंट कर रहा है:

$ find .vim/ -maxdepth 1 -type d
.vim/
.vim/indent
.vim/colors
.vim/doc
.vim/after
.vim/autoload
.vim/compiler
.vim/plugin
.vim/syntax
.vim/ftplugin
.vim/bundle
.vim/ftdetect

आप इसके बजाय निर्देशिका के बच्चों का परीक्षण कर सकते हैं और उनमें बिल्कुल नहीं उतर सकते:

$ find .vim/* -maxdepth 0 -type d
.vim/after
.vim/autoload
.vim/bundle
.vim/colors
.vim/compiler
.vim/doc
.vim/ftdetect
.vim/ftplugin
.vim/indent
.vim/plugin
.vim/syntax

$ find .vim/* -maxdepth 0 -type d | wc -l
11
$ find .vim/ -maxdepth 1 -type d | wc -l
12

आप यह भी उपयोग कर सकते हैं ls:

$ ls -l .vim | grep -c ^d
11


$ ls -l .vim
total 52
drwxrwxr-x  3 anossovp anossovp 4096 Aug 29  2012 after
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 autoload
drwxrwxr-x 13 anossovp anossovp 4096 Aug 29  2012 bundle
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 colors
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 compiler
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 doc
-rw-rw-r--  1 anossovp anossovp   48 Aug 29  2012 filetype.vim
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 ftdetect
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 ftplugin
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 indent
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 plugin
-rw-rw-r--  1 anossovp anossovp 2505 Aug 29  2012 README.rst
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 syntax

$ ls -l .vim | grep ^d
drwxrwxr-x  3 anossovp anossovp 4096 Aug 29  2012 after
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 autoload
drwxrwxr-x 13 anossovp anossovp 4096 Aug 29  2012 bundle
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 colors
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 compiler
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 doc
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 ftdetect
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 ftplugin
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 indent
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 plugin
drwxrwxr-x  2 anossovp anossovp 4096 Aug 29  2012 syntax

अच्छा! आप $ ls -l .vimPHP के साथ यह कैसे करेंगे ? या सूची के बिना केवल कुल कैसे प्राप्त करें। मेरा मतलब है, इस मामले में ही मिलता है 52?
पाथ्र्स

हा। मैं प्यार करता हूँ कि पावरशेल के खिलाफ तर्क यह है कि BASH हर तरह से आसान है ... ऐसा करने के लिए POSH कमांड देखना चाहते हैं? (ls).Count
कोलोब कैन्यन

@Pathros ध्वज GLOB_ONLYDIR और गिनती () परिणाम के साथ ग्लोब का उपयोग करें ।
पिलिप

1
ls -l | grep -c ^dमृत सरल और काम करता है। @Pathros PHP में शायद एक बेहतर तरीका है, लेकिन PHP में सबसे खराब स्थिति आप कमांड लाइन को निष्पादित करने और एक स्ट्रिंग में परिणाम वापस करने के लिए हमेशा shell_exec () फ़ंक्शन का उपयोग कर सकते हैं। यानी $dirCount = shell_exec('ls -l | grep -c ^d');
गीगाबाइट

66

वर्तमान निर्देशिका में केवल निर्देशिकाओं की गिनती प्राप्त करें

echo */ | wc

तुम बाहर डाल की तरह हो जाएगा 1 309 4594

2nd digitका प्रतिनिधित्व करता है। निर्देशिका के।

या

tree -L 1 | tail -1


8
यह विफल रहता है अगर वहाँ dir नामों में रिक्त स्थान हैं, दुर्भाग्य से।
माइकल कैंपबेल

zsh: no matches found: */nullglob की जरूरत
ऐनी वैन

@AnnevanRossum क्या आपके पास है echo। टाइपwhich echo
एमप्‍डडाटा

7
पहले वाले को थोड़ा और बेहतर बनाया जा सकता है:echo */ | wc -w
ibic

नोटा कि यह 1 की गिनती करेगा यदि 0.
jinawee

27
find . -mindepth 1 -maxdepth 1 -type d | wc -l

खोजने के लिए -mindepthनिर्देशिका में कुल संख्या पुनरावृत्ति का मतलब है

-maxdepth निर्देशिका में कुल संख्या पुनरावृत्ति का मतलब है

-type d निर्देशिका का मतलब है

और wc -lसाधनों के लिए इनपुट की पंक्तियों की गणना करें


2
क्या आप अपना उत्तर स्पष्ट कर सकते हैं (अपने उत्तर के अंदर)?
ज़ुलु

-mindepth का मतलब है डाइरेक्टरी में टोटल नंबर रिक्यूसिव, -maxdepth का मतलब है डाइरेक्टरी में टोटल नंबर रिक्यूसिव, -type d का मतलब डायरेक्टरी, और wc -l का मतलब दी हुई डायरेक्टरी लिस्टिंग से लाइन काउंट
shiyani suresh

find . -mindepth 1 -maxdepth 1 -type d | wc -lआपको संख्या के बीच बहुत सारे स्थान देगा, उदाहरण के लिए: ` dir_count=`find . -maxdepth 1 -type d | wc -l | xargs`; echo $dir_count # will print just 2 if (( $dir_count > 1 )); then echo "Yaa"; fi # will print "Yaa"
2`

16

यदि आपके पास केवल फ़ोल्डर में निर्देशिकाएं हैं और कोई फाइल ऐसा नहीं करती है:

ls | wc -l

2
यह भी फाइल हो जाता है, लेकिन सवाल फ़ोल्डर / निर्देशिका के बारे में था।
रॉबर्ट

12

अपनी ड्राइव पर नेविगेट करने और बस निष्पादित करने का सबसे अच्छा तरीका

ls -lR | grep ^d | wc -l

और उपनिर्देशिका सहित कुल में सभी फ़ोल्डर्स को खोजने के लिए?

find /mount/point -type d | wc -l

... या रूट डायरेक्टरी में सभी फ़ोल्डर खोजें (उपनिर्देशिका सहित नहीं)?

find /mount/point -maxdepth 1 -type d | wc -l

चीयर्स!


ध्यान दें कि पिछले ls -lRउन्हें find -type d गिनते समय डॉट उपसर्ग निर्देशिका को अनदेखा करते हैं। यदि आपके पास पहले उप-निर्देशिका (उदाहरण के लिए आपके पास .IT उपनिर्देशिका!) है, तो पहले कमांड द्वारा दी गई गणना गलत है। आप बस -lRaइसलिए उपयोग नहीं कर सकते क्योंकि आपको प्रत्येक डायरेक्टरी ए .और ..एंट्री के लिए भी मिलता है । यह @Pavel Anossov का जवाब देने के लिए भी लागू होता है
marcz

12

stat -c %h folderपरिणाम से 2 को चलाएँ और घटाएँ। यह 2 (या 3 भी) के विरोध में केवल एक ही उपप्रकार का उपयोग करता है जो कि यहां अन्य समाधानों (आमतौर पर findप्लस wc) द्वारा आवश्यक है ।

श / बश का उपयोग करना:

cnt = $ ((`स्टेट -c% h फोल्डर` - 2))
इको $ cnt # 'इको' एक श / बैश बिलिन है, न कि एक अतिरिक्त प्रक्रिया

Csh / tsh का उपयोग करना:

@ cnt = `स्टेट -c% h फ़ोल्डर '- 2
इको $ cnt #' इको 'एक csh / tcsh बिलिन है, एक अतिरिक्त प्रक्रिया नहीं


स्पष्टीकरण: फ़ोल्डरstat -c %h folder में हार्डलिंक की संख्या को प्रिंट करता है , और फ़ोल्डर के तहत प्रत्येक सबफ़ोल्डर में एक ../ प्रविष्टि होती है जो फ़ोल्डर के लिए एक हार्डलिंक है । आपको 2 को घटाना होगा क्योंकि गिनती में दो अतिरिक्त हार्डलिंक हैं:

  1. फ़ोल्डर का स्वयं-संदर्भात्मक ./ प्रविष्टि, और
  2. फ़ोल्डर के माता पिता के फ़ोल्डर के लिए लिंक

इस प्रश्न से संबंधित: [नई निर्देशिका में कुछ भी जोड़ने से पहले 2 की हार्ड लिंक गिनती क्यों है? ] ( unix.stackexchange.com/questions/101515 ) यह बताता है कि यह एक उत्कृष्ट उत्तर क्यों है। दुर्भाग्य से, इसने पर्याप्त ध्यान नहीं दिया! हालांकि यह एक अच्छा जवाब है, इसका परिणाम दुर्भाग्य से फाइलसिस्टम पर निर्भर करता है, लेकिन अधिकांश सामान्य फाइल सिस्टम के लिए, यह काम करेगा।
कांवड़ यात्रा

8

मुझे लगता है कि सबसे आसान है

  ls -ld images/* | wc -l

imagesआपकी लक्ष्य निर्देशिका कहां है -D ध्वज निर्देशिकाओं के लिए सीमा है, और -l झंडा wc -lलाइन की गणना के लिए बहुत परिचित के साथ संगत एक प्रति-पंक्ति लिस्टिंग प्रदर्शन करेगा ।


इसके अलावा परिणाम +1
जोसेफ

1
के अनुसार man ls, -dकरता है: "सूची निर्देशिका खुद, उनकी सामग्री नहीं", अर्थात, यदि आप चलाते हैं ls /tmp, तो आपको वही मिलेगा जो आप में है /tmp, और यदि आप चलाते ls -d /tmpहैं तो आप प्राप्त करते हैं /tmp-dस्विच निर्देशिका फ़िल्टर नहीं करता, के रूप में के लिए कहा गया था।
रॉबर्ट

5

कुछ उपयोगी उदाहरण:

वर्तमान dir में फ़ाइलें गिनें

/bin/ls -lA  | egrep -c '^-'

वर्तमान dir में dirs गिनें

/bin/ls -lA  | egrep -c '^d'

वर्तमान dir में फ़ाइलें और dirs गिनें

/bin/ls -lA  | egrep -c '^-|^d'

एक उपनिर्देशिका में फाइलों और डायरियों की गिनती करें

/bin/ls -lA  subdir_name/ | egrep -c '^-|^d'

मैंने एक अजीब बात देखी है (कम से कम मेरे मामले में):

जब मैं के साथ की कोशिश की है lsबजाय पैरामीटर espected के रूप में नहीं काम। जब मैं उस शो ./ और ../ का उपयोग करता हूं, तो यह गलत परिणाम है। समाधान: इसके बजाय/bin/ls-Ado not list implied . and ..ls/bin/lsls


4

कोई भी निर्देशिका हम नीचे कमांड का उपयोग करके नहीं पा सकते हैं

ls -l | grep "^d" | wc -l


बस ls -l | grep ^d | wc -lकरेंगे, "यहाँ उपयोग करने की कोई आवश्यकता नहीं है
kaspiotr

3

एक शुद्ध बैश समाधान:

shopt -s nullglob
dirs=( /path/to/directory/*/ )
echo "There are ${#dirs[@]} (non-hidden) directories"

यदि आप भी छिपी हुई निर्देशिकाओं को गिनना चाहते हैं:

shopt -s nullglob dotglob
dirs=( /path/to/directory/*/ )
echo "There are ${#dirs[@]} directories (including hidden ones)"

ध्यान दें कि यह निर्देशिकाओं के लिंक भी गिनेगा। यदि आप ऐसा नहीं चाहते हैं, तो यह इस विधि के साथ थोड़ा अधिक कठिन है।


का उपयोग कर find:

find /path/to/directory -type d \! -name . -prune -exec printf x \; | wc -c

चाल xएक निर्देशिका पाया जाता है हर बार stdout करने के लिए उत्पादन करने के लिए है, और फिर wcवर्णों की संख्या की गणना करने के लिए उपयोग करें। यह लिंक को छोड़कर सभी निर्देशिकाओं की संख्या (छिपे हुए सहित) की गणना करेगा।


यहाँ प्रस्तुत विधियाँ मज़ेदार वर्णों के लिए सभी सुरक्षित wrt हैं जो फ़ाइल नाम (रिक्त स्थान, newlines, ग्लोब वर्ण, आदि) में प्रकट हो सकते हैं।


यह इस प्रश्न में प्रस्तुत सबसे अच्छा समाधान है और हमेशा काम करेगा!
कांवड़ यात्रा

3

का उपयोग कर zsh:

a=(*(/N)); echo ${#a}

यह Nएक नलग्लोब है, /यह निर्देशिकाओं का मिलान #करता है। यह बड़े पैमाने पर निर्देशिका नामों में रिक्त स्थान के साथ-साथ 0अगर कोई निर्देशिका नहीं है तो वापस लौटना होगा।


0

सभी फ़ाइलों और सबफ़ोल्डर्स, विंडोज़ शैली की गणना करें:

dir=/YOUR/PATH;f=$(find $dir -type f | wc -l); d=$(find $dir -mindepth 1 -type d | wc -l); echo "$f Files, $d Folders"

0

यदि आप नियमित अभिव्यक्ति का उपयोग करना चाहते हैं, तो कोशिश करें:

ls -c | grep "^d" | wc -l

1
क्या आप अपने कोड में केवल उत्तर के लिए कुछ स्पष्टीकरण जोड़ना चाहेंगे? यह गलत धारणा से लड़ने में मदद करेगा कि StackOverflow एक मुफ्त कोड लेखन सेवा है। इसके अलावा, उपस्थिति में सुधार करने के लिए यहां एक नज़र डालें: stackoverflow.com/editing-help
युनानोश

0

सबसे अच्छा जवाब जो आप चाहते हैं

echo `find . -maxdepth 1 -type d | wc -l`-1 | bc

यह अवांछित को हटाने के लिए एक घटाता है '।' निर्देशिका जो सूचियाँ ढूंढती हैं (जैसा कि ऊपर उल्लिखित patel deven)।

यदि आप सबफ़ोल्डर्स को पुनरावर्ती रूप से गिनना चाहते हैं, तो बस मैक्सडेप विकल्प को छोड़ दें, इसलिए

echo `find . -type d | wc -l`-1 | bc

PS यदि आपको कमांड प्रतिस्थापन बदसूरत लगता है, तो घटाना एक शुद्ध स्ट्रीम का उपयोग करके sedऔर किया जा सकता है bc

गिनती से एक घटाना:

find . -maxdepth 1 -type d | wc -l | sed 's/$/-1\n/' | bc

या, माइनस एक में गिनती जोड़ना:

find . -maxdepth 1 -type d | wc -l | sed 's/^/-1+/' | bc

-1

इसे करने का सबसे अच्छा तरीका:

ls -la | grep -v total | wc -l

यह आपको सही गिनती देता है।


6
आप इसका मतलब है कि यह करने के लिए सबसे खराब तरीका है! इसके अलावा, यह निर्देशिका की संख्या की गणना नहीं करता है और क्या होगा अगर एक निर्देशिका नाम है जिसमें स्ट्रिंग शामिल है total? आपका तरीका टूट गया है :(पार्स मत करोls !
gniourf_gniourf
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.