user4556274 पहले से ही उत्तर है क्यों । मेरा जवाब केवल के लिए अतिरिक्त जानकारी प्रदान करने के लिए कार्य करता है है कि कैसे ठीक से फ़ाइलें गिनती करने के लिए।
यूनिक्स समुदाय में आम सहमति यह है कि आउटपुट को पार्स करना ls
एक बहुत ही बुरा विचार है , क्योंकि फ़ाइल नाम में नियंत्रण वर्ण या छिपे हुए वर्ण हो सकते हैं। उदाहरण के लिए, फ़ाइल नाम में एक नए वर्ण के कारण, हमने ls | wc -l
बताया कि आउटपुट में 5 पंक्तियाँ हैं ls
(जिसमें यह है), लेकिन वास्तव में निर्देशिका में केवल 4 फाइलें हैं।
$> touch FILE$'\n'NAME
$> ls
file1.txt file2.txt file3.txt FILE?NAME
$> ls | wc -l
5
विधि # 1: उपयोगिता खोजें
find
आदेश, जो आम तौर पर काम कर रहे फ़ाइल नाम पार्स करने के लिए प्रयोग किया जाता है, हमें यहाँ मुद्रण द्वारा मदद कर सकते हैं आइनोड संख्या । यह एक निर्देशिका या एक फ़ाइल हो, इसमें केवल एक अद्वितीय इनोड संख्या है। इस प्रकार, का उपयोग करते हुए -printf "%i\n"
और को छोड़कर .
के माध्यम से -not -name "."
हम फ़ाइलों का एक सटीक गणना कर सकते हैं। (नोट करें कि -maxdepth 1
उप-श्रेणियों में पुनरावर्ती अवरोही को रोकने के लिए उपयोग करें )
$> find -maxdepth 1 -not -name "." -print
./file2.txt
./file1.txt
./FILE?NAME
./file3.txt
$> find -maxdepth 1 -not -name "." -printf "%i\n" | wc -l
4
विधि # 2: ग्लोबस्टार
सरल, त्वरित और अधिकतर पोर्टेबल तरीका:
$ set -- *
$ echo $#
228
set
कमांड का उपयोग शेल (जैसे $<INTEGER>
चर echo $1
) के स्थितीय मापदंडों को सेट करने के लिए किया जाता है । यह अक्सर /bin/sh
कमी सरणियों की सीमा के आसपास काम करने के लिए उपयोग किया जाता है । एक संस्करण जो अतिरिक्त जांच करता है, वह यूनिक्स और लिनक्स पर गिल के जवाब में पाया जा सकता है ।
गोले का समर्थन करने वाले गोले में, जैसे bash
, हम उपयोग कर सकते हैं
items=( dir/* )
echo ${#items[@]}
जैसा कि टिप्पणियों में स्टीलड्राइवर द्वारा प्रस्तावित किया गया था ।
find
विधि के समान चाल wc
और ग्लोबस्टार का उपयोग stat
प्रति लाइन इनोड संख्या की गणना करने के लिए किया जा सकता है :
$> LC_ALL=C stat ./* --printf "%i\n" | wc -l
4
एक वैकल्पिक दृष्टिकोण for
लूप में वाइल्डकार्ड का उपयोग करना है । (ध्यान दें, यह परीक्षण यह परीक्षण करने के लिए एक अलग निर्देशिका का उपयोग करता है कि क्या यह दृष्टिकोण उपनिर्देशिका में उतरता है, जो ऐसा नहीं करता है - 16 मेरे में मदों की सत्यापित संख्या है ~/bin
)
$> count=0; for item in ~/bin/* ; do count=$(($count+1)) ; echo $count ; done | tail -n 1
16
विधि # 3: अन्य भाषाओं / दुभाषियों
पायथन समस्याग्रस्त फ़ाइल नाम के साथ मेरे os.listdir()
कार्य को दी गई सूची की लंबाई को मुद्रित करने के माध्यम से भी निपट सकता है (जो गैर-पुनरावर्ती है, और केवल तर्क के रूप में दी गई निर्देशिका में आइटम सूचीबद्ध करेगा)।
$> python -c "import os ; print os.listdir('.')"
['file2.txt', 'file1.txt', 'FILE\nNAME', 'file3.txt']
$> python -c "import os ; print(len(os.listdir('.')))"
4
यह भी देखें
ls | wc -l
फ़ाइल नाम में एक नई पंक्ति के साथ फ़ाइलें हैं, तो विफल हो जाएगा। यह अधिक लचीला है:find . -mindepth 1 -maxdepth 1 -printf . | wc -c