यदि आप जानते हैं कि वर्तमान निर्देशिका में कम से कम एक गैर-छिपी हुई फ़ाइल है:
set -- *; echo "$#"
यह स्पष्ट रूप से किसी भी ग्लोब के लिए सामान्य है।
एक स्क्रिप्ट में, यह स्थितिगत मापदंडों को अधिलेखित करने का कभी-कभी दुर्भाग्यपूर्ण दुष्प्रभाव होता है। आप एक उप-प्रकार का उपयोग करके या एक फ़ंक्शन (बॉर्न / POSIX संस्करण) जैसे के साथ काम कर सकते हैं जैसे:
count_words () {
eval 'shift; '"$1"'=$#'
}
count_words number_of_files *
echo "There are $number_of_files non-dot files in the current directory"
एक वैकल्पिक समाधान है $(ls -d -- * | wc -l)
। यदि ग्लोब है *
, तो कमांड को छोटा किया जा सकता है $(ls | wc -l)
। ls
हमेशा के आउटपुट को पार्स करने से मुझे बेचैनी होती है, लेकिन यहां तब तक काम करना चाहिए जब तक कि आपके फ़ाइल नामों में नईलाइन्स न हों, या आपका ls
बच जाए। और $(ls -d -- * 2>/dev/null | wc -l)
एक मैचिंग ग्लोब के केस को इनायत से हैंडल करने का फायदा है (यानी, यह उस स्थिति में 0 रिटर्न करता है, जबकि इस set *
तरीके के लिए फिडली टेस्ट की जरूरत होती है , अगर ग्लोब खाली हो सकता है)।
यदि फ़ाइल नामों में न्यूलाइन वर्ण हो सकते हैं, तो विकल्प का उपयोग करना है $(ls -d ./* | grep -c /)
।
उन समाधानों में से कोई भी, जो एक ग्लोब के विस्तार को पारित करने पर भरोसा करते ls
हैं, एक तर्क सूची के साथ बहुत लंबी त्रुटि हो सकती है यदि बहुत अधिक मिलान वाली फाइलें हैं।