आप वर्तमान निर्देशिका में सभी फ़ाइलों में किसी पद की प्रत्येक घटना को कैसे गिनेंगे? - और उपनिर्देशिका (?)
मैंने पढ़ा है कि ऐसा करने के लिए आप उपयोग करेंगे grep
; सटीक कमांड क्या है?
इसके अलावा, क्या यह कुछ अन्य कमांड के साथ ऊपर संभव है?
आप वर्तमान निर्देशिका में सभी फ़ाइलों में किसी पद की प्रत्येक घटना को कैसे गिनेंगे? - और उपनिर्देशिका (?)
मैंने पढ़ा है कि ऐसा करने के लिए आप उपयोग करेंगे grep
; सटीक कमांड क्या है?
इसके अलावा, क्या यह कुछ अन्य कमांड के साथ ऊपर संभव है?
जवाबों:
grep
+ का उपयोग करके wc
(यह एक ही पंक्ति पर शब्द के कई आवृत्तियों को पूरा करेगा):
grep -rFo foo | wc -l
-r
में grep
: वर्तमान निर्देशिका पदानुक्रम में पुनरावर्ती खोज करता है;-F
में grep
: एक पैटर्न के बजाय एक निश्चित स्ट्रिंग के खिलाफ मैच;-o
में grep
: प्रिंट केवल मेल खाते हैं;-l
में wc
: लाइनों की गिनती प्रिंट;% tree
.
├── dir
│ └── file2
└── file1
1 directory, 2 files
% cat file1
line1 foo foo
line2 foo
line3 foo
% cat dir/file2
line1 foo foo
line2 foo
line3 foo
% grep -rFo foo | wc -l
8
PCREs
प्रयोग नहीं किया जाना चाहिए क्योंकि वे प्रयोगात्मक हैं
-F
शायद तेज होगा।
-F
बजाय का उपयोग करने की कोशिश नहीं की -P
। महान सुझाव के लिए धन्यवाद, का उपयोग कर अद्यतन -F
, जो वास्तव में यहाँ बेहतर फिट बैठता है।
grep -Rc [term] *
वह करेगा। -R
झंडा मतलब है कि आप रिकर्सिवली वर्तमान निर्देशिका और उसकी उप के सभी खोजना चाहते हैं। *
सभी फाइलें: एक फ़ाइल चयनकर्ता अर्थ है। -c
झंडा बनाता grep
उत्पादन केवल घटनाओं की संख्या। हालाँकि, यदि शब्द एक ही पंक्ति में कई बार होता है, तो इसे केवल एक बार गिना जाता है।
से man grep
:
-r, --recursive
Read all files under each directory, recursively, following symbolic links only if they are on the command line.
This is equivalent to the -d recurse option.
-R, --dereference-recursive
Read all files under each directory, recursively. Follow all symbolic links, unlike -r.
यदि आपकी निर्देशिका में कोई प्रतीकात्मक लिंक नहीं है, तो कोई अंतर नहीं है।
-c
ध्वज को जोड़ सकते हैं grep
। तब grep खुद को गिनता है और आपको wc
--
इससे पहले कि आप चाहते हैं*
*
केवल गैर-dotfiles का विस्तार होगा, ताकि आप उन सभी याद आती है। यह सिर्फ "का उपयोग करने के लिए अधिक समझ में आता है।" चूँकि आपके पास किसी भी तरह से पुनरावृत्ति की प्रक्रिया चल रही है - और उसे डॉट फाइलें मिलेंगी। यहां बड़ी समस्या यह है कि यह किसी शब्द के होने की संख्या नहीं, बल्कि रेखाओं की संख्या हो सकती है। यदि शब्द एक पंक्ति में कई बार दिखाई देता है, तो इसे केवल एक बार "grep -c" द्वारा गिना जाएगा
एक छोटे अजगर लिपि में:
#!/usr/bin/env python3
import os
import sys
s = sys.argv[1]
n = 0
for root, dirs, files in os.walk(os.getcwd()):
for f in files:
f = root+"/"+f
try:
n = n + open(f).read().count(s)
except:
pass
print(n)
count_string.py
।इसे कमांड से डायरेक्टरी से चलाएँ:
python3 /path/to/count_string.py <term>
# get the current working directory
currdir = os.getcwd()
# get the term as argument
s = sys.argv[1]
# count occurrences, set start to 0
n = 0
# use os.walk() to read recursively
for root, dirs, files in os.walk(currdir):
for f in files:
# join the path(s) above the file and the file itself
f = root+"/"+f
# try to read the file (will fail if the file is unreadable for some reason)
try:
# add the number of found occurrences of <term> in the file
n = n + open(f).read().count(s)
except:
pass
print(n)
root
और के f
लिए है?
root
मौजूदा निर्देशिका "ऊपर" सहित फ़ाइल का पथ f
है, फ़ाइल है। वैकल्पिक रूप से, os.path.join()
इस्तेमाल किया जा सकता है, लेकिन अधिक क्रिया है।
n = n + open(f).read().count(s)
?