यदि आप यूनिक्स और लिनक्स के हॉल में चुपचाप खड़े होते हैं और ध्यान से सुनते हैं, तो आप एक भूतिया आवाज़ सुनेंगे, जो कि आप के लिए नई कहानी होगी।
ls -d *snp* | wc -l
या, समकक्ष ,
printf "%s\n" *snp* | wc -l
वे सभी फ़ाइलनामों का उत्पादन करेंगे snp, जिनमें से प्रत्येक में एक नई पंक्ति है ,
लेकिन फ़ाइल नाम में कोई भी नया अंक शामिल है, और फिर आउटपुट में लाइनों की संख्या गिनें। अगर कोई फाइल है जिसका नाम है
f o o
s n p \n
b a r
. t s v
फिर उस नाम के रूप में लिखा जाएगा
foosnp
bar.tsv
जो निश्चित रूप से, दो लाइनों के रूप में गिना जाएगा।
कुछ विकल्प हैं जो कम से कम कुछ मामलों में बेहतर करते हैं:
printf "%s\n" * | grep -c snp
जो इसमें snpमौजूद लाइनों को गिनता है , इसलिए foosnp(\n)bar.tsvऊपर से उदाहरण केवल एक बार गिना जाता है। इस पर थोड़ी भिन्नता है
ls -f | grep -c snp
उपर्युक्त दोनों आज्ञाएँ इसमें भिन्न हैं:
- उन
ls -fफ़ाइलों में शामिल होंगे जिनके नाम के साथ शुरू होता है .; printf … *जब तक ऐसा नहीं करता, dotglobखोल विकल्प निर्धारित है।
printfएक शेल बिलिन है; lsएक बाहरी कमांड है। इसलिए, lsथोड़ा अधिक संसाधनों का उपयोग कर सकते हैं।
- जब शेल प्रक्रिया करता है
*, तो यह फ़ाइल नाम को सॉर्ट करता है;
ls -fफ़ाइल नाम सॉर्ट नहीं करता है। इसलिए, lsथोड़ा कम संसाधनों का उपयोग कर सकते हैं।
लेकिन उनके पास सामान्य रूप से कुछ है: वे दोनों ऐसे नामपटनों की उपस्थिति में गलत परिणाम देंगे जिनमें नई रूपरेखा शामिल है और snpनई रेखा के पहले और बाद दोनों हैं ।
एक और:
filenamelist=(*snp*)
echo ${#filenamelist[@]}
यह सभी फ़ाइलनामों को सूचीबद्ध करने वाले शेल सरणी चर बनाता है snpऔर फिर सरणी में तत्वों की संख्या की रिपोर्ट करता है। फ़ाइलनामों को तार के रूप में माना जाता है, न कि रेखाओं के रूप में, इसलिए एम्बेडेड newlines कोई समस्या नहीं है। यह अनुमान योग्य है कि निर्देशिका के विशाल होने पर इस दृष्टिकोण में समस्या हो सकती है, क्योंकि फ़ाइल नाम की सूची को शेल मेमोरी में रखा जाना चाहिए।
अभी तक एक और:
इससे पहले, जब हमने कहा printf "%s\n" *snp*, printfकमांड ने "%s\n"विस्तार में प्रत्येक तर्क के लिए एक बार प्रारूप स्ट्रिंग (पुन: उपयोग) किया *snp*। यहाँ, हम उसमें एक छोटा सा बदलाव करते हैं:
printf "%.0s\n" *snp* | wc -l
यह "%.0s\n"विस्तार के प्रत्येक तर्क के लिए एक बार प्रारूप स्ट्रिंग (पुन: उपयोग) को दोहराएगा *snp*। लेकिन "%.0s"प्रत्येक स्ट्रिंग के पहले शून्य अक्षरों को प्रिंट करने का मतलब है - यानी, कुछ भी नहीं। यह printfकमांड प्रत्येक फ़ाइल के लिए केवल एक नई लाइन (यानी, एक रिक्त लाइन) का उत्पादन करेगा जिसमें snpउसका नाम शामिल है; और फिर wc -lउन्हें गिनेंगे। और, फिर से, आप .फ़ाइलों को सेटिंग में शामिल कर सकते हैं dotglob।