আপনি বর্তমান ডিরেক্টরিতে সমস্ত ফাইলের মধ্যে কোনও পদটির প্রতিটি সংখ্যাকে কীভাবে গণনা করবেন? - এবং উপ-ডিরেক্টরি (?)
আমি পড়েছি যে এটি করার জন্য আপনি ব্যবহার করবেন 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
পতাকা মানে আপনি recursively বর্তমান ডিরেক্টরি ও তার সাব সব অনুসন্ধান করতে চান। *
সব ফাইল: একটি ফাইল নির্বাচক অর্থ। -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
--
আগে রাখতে চান*
*
নন-ডটফাইলগুলিতে প্রসারিত হবে, সুতরাং আপনি সেগুলি মিস করেন। এটি কেবল "" ব্যবহার করা আরও বেশি অর্থবোধ করে। যেহেতু আপনার'ই তবুও পুনরাবৃত্তিমূলকভাবে তর্কগুলি প্রক্রিয়া করতে যাচ্ছেন - এবং এটি ডট ফাইলগুলি পাবে। এখানে সবচেয়ে বড় সমস্যাটি হ'ল এটি কোনও শব্দের সংখ্যার সংখ্যার চেয়ে লাইন সংখ্যাটি করতে পারে। শব্দটি যদি এক লাইনে একাধিকবার প্রদর্শিত হয়, তবে এটি কেবল একবার "
একটি ছোট অজগর লিপি:
#!/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)
?