কোড লাইন গণনা?


24

যদি আমি কোডের লাইনগুলি গণনা করতে চাই তবে তুচ্ছ জিনিস

cat *.c *.h | wc -l

তবে আমার যদি বেশ কয়েকটি সাব-ডাইরেক্টরি থাকে?



3
অফ-বিষয়: অযথা কেন cat? wc -l *.c *.hএকই জিনিস।
টমাস প্যাড্রন-ম্যাকার্থি

5
@ থমাস প্যাড্রন-ম্যাকার্থি না এটি হয় না। আপনার wc -l *.c *.h | tail -n 1অনুরূপ আউটপুট পাওয়া দরকার ।
গিলস 'তাই খারাপ হওয়া বন্ধ করুন'

2
নোট করুন যে কয়েকটি (সম্ভবত এমনকি বেশিরভাগ) আধুনিক শেল (ব্যাশ ভি 4, জেডএস, সম্ভবত আরও) একটি পুনরাবৃত্ত-গ্লোববিং মেকানিজম ব্যবহার করে **, যাতে আপনি ব্যবহার করতে পারেন wc -l **/*.{h,c}বা অনুরূপ কিছু করতে পারেন । নোট করুন যে বাশ-এ, কমপক্ষে, এই বিকল্পটি (কল করা globstar) ডিফল্টরূপে বন্ধ থাকে । তবে এটিও লক্ষ করুন যে এই বিশেষ ক্ষেত্রে, clocবা SLOCCountএটি আরও ভাল বিকল্প। (এছাড়াও সহজে সোর্স ফাইলগুলি সন্ধান / তালিকা ackকরার findজন্য পছন্দনীয় হতে পারে ))
কাইল স্ট্র্যান্ড

5
wc -l কোডের লাইন নয়, লাইন গণনা করে। 7000 ফাঁকা লাইনগুলি এখনও ডাব্লুসি-লি-তে প্রদর্শিত হবে তবে কোনও কোড মেট্রিকে গণনা করা হবে না। (মন্তব্যগুলি খুব সাধারণত গণনা করা হয় না)
কোটায়ার

উত্তর:


49

বলা সহজ সরঞ্জামটি হ'ল সহজ উপায় cloc। এটি এইভাবে ব্যবহার করুন:

cloc .

এটাই. :-)


1
-1 কারণ এই প্রোগ্রামটির অল্প, বিরক্তিকর মস্তিষ্কের বাইরে ভাষায় কোডের লাইনগুলি স্বীকৃতি দেওয়ার কোনও উপায় নেই। এটি অ্যাডা এবং পাস্কাল এবং সি এবং সি ++ এবং জাভা এবং জাভাস্ক্রিপ্ট এবং "এন্টারপ্রাইজ" টাইপ ভাষা সম্পর্কে জানে, তবে এটি কেবল ফাইল এক্সটেনশনের মাধ্যমে এসএলওসি গণনা করতে অস্বীকার করে এবং এভাবে ডিএসএলগুলির জন্য সম্পূর্ণ অকেজো, বা এমন ভাষাও জানা থাকে যা এটি জানা থাকে না সম্পর্কিত.
বিড়াল

21
@ কেট কিছুই নিখুঁত নয় এবং কিছুই আপনার অতীত ও ভবিষ্যতের সমস্ত দাবি পূরণ করতে পারে না।
হো 1

2
ঠিক আছে, যে প্রোগ্রামিং ভাষাটি সিএলওসি স্বীকৃতি দিতে অস্বীকার করেছে তা সত্যই আমার অতীত এবং ভবিষ্যতের সমস্ত দাবি পূরণ করে :)
বিড়াল

6
সিএলওসি ডকুমেন্টেশন অনুযায়ী @ বিড়াল এটি কোনও ভাষা সংজ্ঞা ফাইলে পড়তে পারে, তাই এটি সংজ্ঞায়িত না করে ভাষাগুলিতে কোড সনাক্ত করার উপায় আছে is প্লাস এটি ওপেন সোর্স, যাতে আপনি এটি আরও ভাল করতে সর্বদা এটি বাড়িয়ে দিতে পারেন!
সেন্টেমানে

39

আপনি সম্ভবত ব্যবহার করা উচিত SLOCCount বা cloc এই জন্য, তারা একটি প্রকল্পে সোর্স কোড লাইনের গণনা জন্য বিশেষভাবে ডিজাইন করা করছি ডিরেক্টরি গঠন নির্বিশেষে ইত্যাদি .; পারেন

sloccount .

অথবা

cloc .

বর্তমান ডিরেক্টরি থেকে শুরু করে সমস্ত উত্স কোডে একটি প্রতিবেদন তৈরি করবে।

আপনি যদি ব্যবহার করতে চান findএবং wc, জিএনইউতে wcএকটি দুর্দান্ত --files0-fromবিকল্প রয়েছে:

find . -name '*.[ch]' -print0 | wc --files0-from=-

(ধন্যবাদ SnakeDoc জন্য cloc পরামর্শ !)


স্লোকাউন্টের জন্য +1। মজার বিষয় হচ্ছে, চলমান sloccount /tmp/stackexchange(আমার সাম্প্রতিক পুনরায় বুট করার পরে 17 ই মে আবার তৈরি হয়েছে) বলেছে যে শে, পারল, অ্যাজক ইত্যাদি ফাইলগুলি বিকাশের জন্য আনুমানিক ব্যয়টি 11,029 ডলার। এবং এটিতে ওয়ান-লাইনারগুলি অন্তর্ভুক্ত নয় যা এটিকে কখনও স্ক্রিপ্ট ফাইল হিসাবে তৈরি করে না।
কাস

11
কোডের লাইনের ভিত্তিতে মূল্য নির্ধারণ করা? স্প্যাগেটি পুনরায় ফ্যাক্টর রক্ষণযোগ্য কিছুতে নিয়োগের জন্য নিযুক্ত সমস্ত লোকের কী হবে?
মনিকা মনিকা

@ ওরেঞ্জডগ আপনি সর্বদা ওভারহেডে অ্যাকাউন্টের জন্য চেষ্টা করতে পারেন; গণনার ব্যাখ্যার জন্য ডকুমেন্টেশন দেখুন (খুব পুরানো বেতনের ডেটা সহ) এবং আপনি যে প্যারামিটারগুলি টুইট করতে পারেন।
স্টিফেন কিট

5
clocপাশাপাশি ভাল: github.com/AlDanial/cloc
স্নেকডক

@ স্টেফেনকিট> এখনও, মূল বিষয়টি এটি পিছনের দিকে গণনা। কোড সাফ করার সময় আপনি প্রায়শই কম লাইনের সাথে শেষ হন। নিশ্চিত যে আপনি মুছে ফেলা একটির জন্য অ্যাকাউন্টের বাকী কোডটি চাপিয়ে দেওয়ার জন্য একটি ওভারহেড হ্যান্ডওয়েভ করার চেষ্টা করতে পারেন, তবে পুরো স্থানটি প্রথম স্থানে অনুমান করার চেয়ে এটি কীভাবে ভাল তা আমি দেখতে পাই না।
বর্ণা

10

হিসাবে wcকমান্ড একাধিক আর্গুমেন্ট গ্রহণ করতে পারেন, আপনি শুধু সব ফাইলের নামের পাস করতে পারেন wcব্যবহার +আর্গুমেন্ট -execগনুহ কর্ম find:

find . -type f -name '*.[ch]' -exec wc -l {} +

বিকল্পভাবে, ইন bash, globstarডিরেক্টরিগুলি পুনরাবৃত্তভাবে অতিক্রম করতে শেল বিকল্পটি ব্যবহার করে :

shopt -s globstar
wc -l **/*.[ch]

অন্যান্য শেলগুলি ডিফল্টরূপে (যেমন zsh) পুনরাবৃত্তিমূলকভাবে অতিক্রম করে বা globstarকমপক্ষে বেশিরভাগ ক্ষেত্রে একই ধরণের বিকল্প রয়েছে well


1
আমার যে রুট নেই এমন মেশিনে অ-মানক সফ্টওয়্যার ইনস্টল করার প্রয়োজন নেই তার জন্য +1
বামবায়োমি

5

আপনি findএকসাথে xargsএবং এর সাথে ব্যবহার করতে পারেন wc:

find . -type f -name '*.h' -o -name '*.c' | xargs wc -l

2
(এটি ধরে নিয়েছে যে ফাইল পাথগুলিতে ফাঁকা, নিউলাইনগুলি, একক উদ্ধৃতি, ব্যাকস্ল্যাশ অক্ষরের ডাবল উদ্ধৃতি নেই don't totalতবে বেশ কয়েকটি লাইন wcআহ্বান করা হলে এটি বেশ কয়েকটি লাইন
আউটপুটও করতে পারে

সম্ভবত কয়েক wcকমান্ড সমস্যা বংশীধ্বনিতুল্য দ্বারা সুরাহা করা যেতে পারে findকরার while read FILENAME; do . . .doneকাঠামো। এবং ভিতরে লুপ ব্যবহার করুন wc -l। বাকিগুলি মোট লাইনগুলিকে একটি ভেরিয়েবলের সংমিশ্রণ করে প্রদর্শন করছে।
সের্গেই কলডিয়াজন্য

5

আপনি যদি এমন পরিবেশে থাকেন তবে যেখানে আপনার অ্যাক্সেস নেই clocইত্যাদি I'd

find -name '*.[ch]' -type f -exec cat '{}' + | grep -c '[^[:space:]]'

রান-থ্রু: findসমস্ত নিয়মিত ফাইলগুলির জন্য পুনরাবৃত্তি অনুসন্ধান করে যাদের নাম শেষ হয় .cবা .hসেগুলিতে চলে catgrepসমস্ত খালি ফাঁকা লাইন গণনা করার জন্য আউটপুটটি পাইপ করা হয় (যেগুলিতে কমপক্ষে একটি অ-ফাঁক অক্ষর থাকে)।


4

মন্তব্যগুলিতে cat file | wc -lযেমন উল্লেখ করা হয়েছে, সমান নয়wc -l file কারণ প্রাক্তনগুলি কেবল একটি সংখ্যা প্রিন্ট করে যেখানে পরেরটি একটি সংখ্যা এবং ফাইলের নাম মুদ্রণ করে। একইভাবে cat * | wc -lকেবল একটি সংখ্যা wc -l *মুদ্রণ করবে , যেখানে প্রতিটি ফাইলের জন্য তথ্যের একটি লাইন প্রিন্ট করবে।

সরলতার চেতনায়, আসুন জিজ্ঞাসা করা প্রশ্নটি আবার দেখা যাক:

যদি আমি কোডের লাইনগুলি গণনা করতে চাই তবে তুচ্ছ জিনিস

cat *.c *.h | wc -l

তবে আমার যদি বেশ কয়েকটি সাব-ডাইরেক্টরি থাকে?

প্রথমত, আপনি আপনার তুচ্ছ আদেশটি এখানে সরল করতে পারেন:

cat *.[ch] | wc -l

এবং পরিশেষে, বহু-উপ-ডিরেক্টরি সমতুল্য:

find . -name '*.[ch]' -exec cat {} + | wc -l

এটি সম্ভবত বিভিন্ন উপায়ে উন্নত করা যেতে পারে যেমন মেলানো ফাইলগুলিকে কেবল নিয়মিত ফাইলগুলিতে সীমাবদ্ধ করা (ডিরেক্টরি নয়) -type fতবে প্রদত্ত findকমান্ডটি হুবহু পুনরাবৃত্তির সমতুল্য cat *.[ch]


3

নমুনা ব্যবহার করে awk:

find . -name '*.[ch]' -exec wc -l {} \; |
  awk '{SUM+=$1}; END { print "Total number of lines: " SUM }'

+জায়গায় ব্যবহার করুন \;
জোনাথন লেফলার

@ জোনাথনলফলার কেন?
হাস্তুর

1
@Hastur: এটা রান wc -lফাইলের দলের জন্য, বরং ভালো xargsনা, কিন্তু এটা হয় ছাড়াই ফাইল নাম (ব্যবধান মত) বিজোড় বল অক্ষর পরিচালনা xargsঅথবা (অ-মানক) -print0এবং -0অপশন findএবং xargsযথাক্রমে। এটি একটি সামান্য অপ্টিমাইজেশন। নেতিবাচক দিকটি হ'ল wcএকাধিক ফাইল দেওয়ার সময় প্রতিটি আবেদনের শেষে মোট লাইন গণনা আউটপুট হবে - awkস্ক্রিপ্টটি এর সাথে ডিল করত। সুতরাং, এটি একটি স্ল্যাম-ডাঙ্ক নয়, কিন্তু খুব প্রায়ই ব্যবহার +স্থানে \;সঙ্গে findএকটি ভাল ধারণা।
জোনাথন লেফলার

@ জোনাথনলফলার আপনাকে ধন্যবাদ আমি রাজী. আমার উদ্বেগগুলি অবশ্য প্যারামিটার স্ট্রিংয়ের দৈর্ঘ্যের বিষয়ে ছিল wc। যদি অজানা কোনও ফাইলের সংখ্যা পাওয়া যায় তবে সেই সীমাটি অতিক্রম করার ঝুঁকি রয়েছে কি না কোনওভাবে এটি অনুসন্ধানের মাধ্যমে পরিচালিত হবে?
হাস্তুর

2
@ হাস্তুর: findফাইলগুলিকে সুবিধাজনক আকারের বান্ডিলগুলিতে ভাগ করে দেয়, যা পরিবেশের জন্য মঞ্জুরি দেয় প্ল্যাটফর্মের মধ্যে যুক্তি তালিকার দৈর্ঘ্য সীমা অতিক্রম করবে না (যা যুক্তি তালিকার দৈর্ঘ্যের বাইরে আসে - সুতরাং যুক্তির তালিকার সাথে দৈর্ঘ্যের দৈর্ঘ্য পরিবেশের দৈর্ঘ্য সর্বাধিক মানের চেয়ে কম হওয়া উচিত)। আইওডাব্লু, findকাজ ঠিক যেমন কাজ ঠিক মত xargsকরে।
জোনাথন লেফলার

1

সহজ আদেশ:

find . -name '*.[ch]' | xargs wc -l

(এটি ধরে নিয়েছে যে ফাইল পাথগুলিতে ফাঁকা, নিউলাইনগুলি, একক উদ্ধৃতি, ব্যাকস্ল্যাশ অক্ষরের ডাবল উদ্ধৃতি নেই don't totalতবে বেশ কয়েকটি লাইন wcআহ্বান করা হলে এটি বেশ কয়েকটি লাইন
আউটপুটও করতে পারে

0

আপনি যদি লিনাক্সে থাকেন তবে আমি আমার নিজের সরঞ্জাম, বহুবৃত্তের প্রস্তাব দিই । এটি নাটকীয়ভাবে দ্রুত clocএবং এর চেয়ে আরও বেশি বৈশিষ্ট্যযুক্ত sloccount

আপনার বিএসডি তেও তৈরি করতে সক্ষম হওয়া উচিত, যদিও কোনও প্রদত্ত বাইনারি নেই।

আপনি এটি দিয়ে প্রার্থনা করতে পারেন

poly .

-2

find . -name \*.[ch] -print | xargs -n 1 wc -lকৌতুক করা উচিত। পাশাপাশি বেশ কয়েকটি সম্ভাব্য প্রকরণ রয়েছে যেমন -execআউটপুটটি পাইপ করার পরিবর্তে ব্যবহার করা wc


4
তবে find . -name \*.[ch] -printফাইলগুলির বিষয়বস্তু মুদ্রণ করে না, কেবলমাত্র ফাইলের নাম। সুতরাং আমি ফাইল নম্বর সংখ্যা পরিবর্তে আমি না? আমার কি 'xargs' দরকার?
নিক্লাস

@ প্রোগ্রামার ৪০০ হ্যাঁ, আপনার প্রয়োজন হবে xargsএবং আপনার wcযদি প্রচুর ফাইল থাকে তবে আপনাকে একাধিক অনুরোধও দেখার দরকার ছিল ; আপনার সমস্ত totalলাইন সন্ধান এবং তাদের যোগফল প্রয়োজন sum
স্টিফেন কিট

আপনি যদি কেবলমাত্র মোট লাইন গণনা চান, তবে আপনাকে যা করতে হবেfind . -name \*.[ch] -print0 | xargs -0 cat | wc -l
ফ্লফি

নোট করুন যে এটি ( find . -name \*.[ch] -print | wc -l) ফাইলের সংখ্যা গণনা করে (যদি কোনও ফাইলের নামটিতে একটি নতুন লাইন থাকে না - তবে এটি খুব অস্বাভাবিক) - এটি ফাইলগুলির লাইন সংখ্যা গণনা করে না।
জোনাথন লেফলার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.