दी गई स्ट्रिंग वाली फ़ाइलों की संख्या


19

मैं बैश / श में इनपुट के रूप में दी गई स्ट्रिंग वाली फाइलों की संख्या (एक निर्देशिका में) कैसे गिन सकता हूं?

जवाबों:


30

grep -l "string" * | wc -l कार्यशील निर्देशिका में सभी फ़ाइलों की सामग्री में "स्ट्रिंग" की खोज करेंगे और आपको बताएंगे कि कितने मिलान हुए।


1
यह काम नहीं करेगा यदि निर्देशिका में बहुत सारी फाइलें हैं, तो यह "zsh: तर्क सूची बहुत लंबी: grep" त्रुटि को फेंक देगा। इससे छुटकारा पाने के बारे में कोई विचार?

1
@ user16142 फ़ाइलों के बजाय निर्देशिका को grep करें: grep -lr "string" directory | wc -lयदि आप पुनरावर्ती खोज नहीं चाहते हैं, तो आप अधिकतम विकल्प के साथ खोज का उपयोग कर सकते हैं: find directory -maxdepth 1 -type f -exec grep -l "string" {} + | wc -lध्यान दें कि यह दूसरा विकल्प grep की तुलना में धीमा है।
आगरगरा

9

greps पैरामीटर -lकेवल उन फिल्नामों को आउटपुट करेगा जो मिलान कर रहे हैं $PATTERN, wcउन्हें बाद में गिन सकते हैं।

grep -l "$PATTERN" * | wc -l

धन्यवाद, लेकिन फ़ाइल में एक पैटर्न के साथ सोच रहा था ... अस्पष्ट प्रश्न के लिए क्षमा करें

यदि हां, तो वुल्फ का जवाब लें।
वाग

3
awk '/pattern_to_look_for/ {s+=1; nextfile;} END {print s}' *

स्पष्टता: यह उन फाइलों की संख्या की तलाश करता है जिनकी सामग्री में "pattern_to_look_for" है और उनके फ़ाइल नाम में नहीं है (जैसे कि वैग का उत्तर)। आपके प्रश्न से यह बताना मुश्किल है कि आप क्या देख रहे हैं।


लेकिन कुछ याद आ रहा है? क्योंकि यह काम नहीं करता है

यदि आप स्ट्रिंग बतख की तलाश करते हैं, तो आपको इसे / बतख / अक्क में लिखना होगा। क्या आप ऐसा कर रहे हैं?
जन परसन

हां, आउटपुट: awk: रीड एरर (एक डायरेक्टरी है)

वुल्फ का जवाब आपको डुप्लिकेट देगा। यदि स्ट्रिंग की कई घटनाएं हैं जिन्हें आप फ़ाइलों में से एक में देख रहे हैं, तो यह अतिरिक्त मैचों के रूप में गिना जाएगा।
Jan Persson

ठीक है, अगर आपके पास फ़ोल्डर में निर्देशिकाएं हैं, तो आपको कुछ अतिरिक्त सामान करना होगा जैसे कि स्टार को इस तरह से बदलना find . ! -name . -prune -type f(बैकस्टिक्स को याद न करना)। यह कमांड केवल फ़ोल्डर में फाइलों को सूचीबद्ध करता है।
जनवरी पेरसन

2

यह बैश में किसी भी नाम के साथ काम करता है :

grep -lZ "$pattern" * | tr -cd '\000' | wc -c

स्पष्टीकरण:

  • grepके -Zविकल्प के लिए एक ␀-बाइट विभाजक के साथ हर परिणाम प्रिंट करता है। यह चरित्र किसी फ़ाइल नाम का हिस्सा नहीं हो सकता है, इसलिए हम केवल फ़ाइलों की संख्या प्राप्त करने के लिए विभाजकों की संख्या की गणना कर सकते हैं।
  • उत्पादन में अन्य पात्रों से छुटकारा पाने के लिए, हम बस सब कुछ को हटाने को छोड़कर का उपयोग कर बाइट ␀ tr
  • तो बस पात्रों के साथ गिनती wc
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.