"ফলাফল" ফলাফল গণনা করার সেরা উপায় কী?


101

আমার বর্তমান সমাধানটি হবে find <expr> -exec printf '.' \; | wc -cতবে 10000 এরও বেশি ফলাফল পাওয়া গেলে এটি অনেক বেশি সময় নেয়। এটি করার কোনও দ্রুত / সর্বোত্তম উপায় নেই?


আপনার সন্ধানের ফলাফলগুলিতে ডব্লিউসি-এল ব্যবহার করুন
ম্যানুয়েল সেলভা

উত্তর:


86

পরিবর্তে এটি চেষ্টা করুন ( 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লাইন)


6
সমতুল্য নয়, এটি আরও নির্ভরযোগ্য =)
গিলস কুইনট

6
এটি খুঁজে পাওয়ার জন্য প্রিন্টফ পতাকাটি যদি আপনার প্ল্যাটফর্মে সমর্থিত না হয় তবে এটি আরও নির্ভরযোগ্য নয়। ;-)
র্যান্ডি হাওয়ার্ড

7
নোট করুন যে বিন্দুতে উদ্ধৃতি না দিয়ে আপনি আরও কয়েকটি ন্যানোসেকেন্ডগুলি শেভ করতে পারেন-printf '.'
জেনস

6
@ জেনস - বিশেষত যখন আপনি টাইপ করতে সময়টি বিবেচনা করেন
ব্রায়ান অগ্নিউ ২

6
এই জাতীয় একটি ছোট মানদণ্ডের সাহায্যে সময়গুলি সম্ভবত আপনি পরিমাপ করতে চান তার চেয়ে অন্য কারণগুলির দ্বারা আধিপত্য বজায় রাখে। একটি বড় গাছ নিয়ে একটি পরীক্ষা আরও দরকারী হবে। তবে ওপি যা চেয়েছিল তা করার জন্য এটি আমার ভোট পায়।
ট্রিপলি

134

কেন না

find <expr> | wc -l

একটি সহজ বহনযোগ্য সমাধান হিসাবে? আপনার আসল সমাধানটি প্রতিটি পৃথক ফাইলের জন্য একটি নতুন প্রক্রিয়া printf তৈরি করছে এবং এটি অত্যন্ত ব্যয়বহুল (যেমন আপনি সন্ধান করেছেন) found

মনে রাখবেন যে এম্বেড করা নতুন লাইনের সাথে আপনার ফাইলের নাম থাকলে এটি ওভারকাউন্ট হবে, তবে আপনার যদি তা থাকে তবে আমি সন্দেহ করি যে আপনার সমস্যাগুলি আরও গভীরতরভাবে চলে।


9
-1: নতুন
লাইনের

23
আমি মনে করি না যে ফাইলনাম / নতুন লাইনের সীমাবদ্ধতা খুব বিরল এবং উপরে উল্লিখিত হয়েছে এমন একটি ডাউনওয়েটের ওয়্যারেন্ট দেয় । ধীর? সম্ভবত। আপনি একটি ফাইল সিস্টেম জিজ্ঞাসা করছেন প্রদত্ত আমি সন্দেহ করি গতির পার্থক্য খুব কম। আমার 10,000 টি ফাইল জুড়ে আমি 3 মিমি পার্থক্য পরিমাপ করি
ব্রায়ান অগ্নিউ

8
'Find <expr> | wc -l' এবং 'Find <expr> -printf' এর মধ্যে পারফরম্যান্সের পার্থক্য। | ডাব্লুসিসি -সি 'অত্যন্ত ছোট। ক্যাচিং (অর্থাত্ যদি আপনি একই গাছের উপরে একবারে একই চালনা করেন) তবে আরও গুরুত্বপূর্ণ। আইএমএইচও "WC -l" দিয়ে সমাধান অনেক বেশি স্বজ্ঞাত।
পিটসাইকার

5

এই সমাধান অবশ্যই ধীর অন্যান্য কিছু চেয়ে 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 বাইট) ব্যবহার করে এটি পড়ার মাধ্যমে অমানুষিক নামগুলির সাথে ফাইলগুলি সঠিকভাবে পরিচালনা করে ।


4

এটি আমার countfilesকাজ ~/.bashrc(এটি যথাযথভাবে দ্রুত, লিনাক্স এবং ফ্রিবিএসডি এর জন্য কাজ করা উচিত findএবং নতুন লাইনের অক্ষরযুক্ত ফাইল পাথ দ্বারা বোকা বানাবে না; চূড়ান্তটি wcNUL বাইট গণনা করে):

countfiles () 
{ 
   command find "${1:-.}" -type f -name "${2:-*}" -print0 | 
       command tr -dc '\0' | command wc -c;
return 0
}

countfiles

countfiles ~ '*.txt'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.