আমার বর্তমান সমাধানটি হবে find <expr> -exec printf '.' \; | wc -c
তবে 10000 এরও বেশি ফলাফল পাওয়া গেলে এটি অনেক বেশি সময় নেয়। এটি করার কোনও দ্রুত / সর্বোত্তম উপায় নেই?
উত্তর:
পরিবর্তে এটি চেষ্টা করুন ( find
এর -printf
সমর্থন প্রয়োজন):
find <expr> -type f -printf '.' | wc -c
এটি লাইনগুলি গণনার চেয়ে আরও নির্ভরযোগ্য এবং দ্রুত হবে।
মনে রাখবেন যে আমি বাহ্যিক কমান্ড নয়, find
এর ব্যবহার করি printf
।
কিছুটা বেঞ্চ করা যাক:
$ ls -1
a
e
l
ll.sh
r
t
y
z
আমার স্নিপেট মানদণ্ড:
$ time find -type f -printf '.' | wc -c
8
real 0m0.004s
user 0m0.000s
sys 0m0.007s
সম্পূর্ণ লাইন সহ:
$ time find -type f | wc -l
8
real 0m0.006s
user 0m0.003s
sys 0m0.000s
সুতরাং আমার সমাধানটি দ্রুত =) (গুরুত্বপূর্ণ অংশটি real
লাইন)
-printf '.'
কেন না
find <expr> | wc -l
একটি সহজ বহনযোগ্য সমাধান হিসাবে? আপনার আসল সমাধানটি প্রতিটি পৃথক ফাইলের জন্য একটি নতুন প্রক্রিয়া printf
তৈরি করছে এবং এটি অত্যন্ত ব্যয়বহুল (যেমন আপনি সন্ধান করেছেন) found
মনে রাখবেন যে এম্বেড করা নতুন লাইনের সাথে আপনার ফাইলের নাম থাকলে এটি ওভারকাউন্ট হবে, তবে আপনার যদি তা থাকে তবে আমি সন্দেহ করি যে আপনার সমস্যাগুলি আরও গভীরতরভাবে চলে।
এই সমাধান অবশ্যই ধীর অন্যান্য কিছু চেয়ে find -> wc
সমাধান এখানে, কিন্তু আপনি পারে যদি আপনি তাদের গণনা ছাড়াও ফাইলের নাম দিয়ে অন্য কিছু কি আনত হয় read
থেকে find
আউটপুট।
n=0
while read -r -d ''; do
((n++)) # count
# maybe perform another act on file
done < <(find <expr> -print0)
echo $n
এটি কেবল বাশগুইডে পাওয়া একটি সমাধানের সংশোধন যা find
আউটপুট ডিলিমেটারকে NUL বাইট ব্যবহার print0
করে ''
এবং লুপ ডিলিমিটার হিসাবে (NUL বাইট) ব্যবহার করে এটি পড়ার মাধ্যমে অমানুষিক নামগুলির সাথে ফাইলগুলি সঠিকভাবে পরিচালনা করে ।
এটি আমার countfiles
কাজ ~/.bashrc
(এটি যথাযথভাবে দ্রুত, লিনাক্স এবং ফ্রিবিএসডি এর জন্য কাজ করা উচিত find
এবং নতুন লাইনের অক্ষরযুক্ত ফাইল পাথ দ্বারা বোকা বানাবে না; চূড়ান্তটি wc
NUL বাইট গণনা করে):
countfiles ()
{
command find "${1:-.}" -type f -name "${2:-*}" -print0 |
command tr -dc '\0' | command wc -c;
return 0
}
countfiles
countfiles ~ '*.txt'