কোনও ডিরেক্টরিতে পুনরাবৃত্তভাবে কোডের সমস্ত লাইন গণনা কিভাবে?


1620

আমরা একটি পিএইচপি অ্যাপ্লিকেশন পেয়েছি এবং একটি নির্দিষ্ট ডিরেক্টরি এবং এর উপ-ডিরেক্টরিগুলির অধীনে কোডের সমস্ত লাইন গণনা করতে চাই। আমাদের মন্তব্যগুলিকে উপেক্ষা করার দরকার নেই, কারণ আমরা কেবল একটি মোটামুটি ধারণা পাওয়ার চেষ্টা করছি।

wc -l *.php 

এই আদেশটি একটি প্রদত্ত ডিরেক্টরিতে দুর্দান্ত কাজ করে তবে সাব-ডিরেক্টরিকে উপেক্ষা করে। আমি ভাবছিলাম এটি কার্যকর হতে পারে তবে এটি 74 ফিরে আসবে, যা অবশ্যই তা নয় ...

find . -name '*.php' | wc -l

সমস্ত ফাইলগুলিতে খাওয়ার সঠিক বাক্য গঠন কী?

উত্তর:


2647

চেষ্টা করুন:

find . -name '*.php' | xargs wc -l

এসএলওসকন্ট সরঞ্জামটি পাশাপাশি সহায়তা করতে পারে।

এটি আপনি যে শ্রেণিবিন্যাসের দিকে লক্ষ্য রাখছেন, সেইসাথে কিছু অতিরিক্ত পরিসংখ্যানের জন্য কোড গণনার একটি সঠিক উত্স রেখা দেবে।

সাজানো আউটপুট:

find . -name '*.php' | xargs wc -l | sort -nr


31
cloc.sourceforge.net স্লোকাউন্টের বিকল্প হিসাবে দেখার জন্য উপযুক্ত হতে পারে (আরও ভাষা তবে কম তথ্য)
AsTeR

31
এর সাথে ফাইলগুলিও অন্তর্ভুক্ত রয়েছে:find . -name '*.php' -o -name '*.inc' | xargs wc -l
রাইমো

52
এই এক নম্বর আছে যখন অনেক ফাইল (কারণ থেকেও বেশি মুদ্রণ করবে wcএকাধিক বার চলবে এছাড়াও অনেক বিশেষ ফাইলের নাম হ্যান্ডেল
l0b0

42
@idober:find . -name "*.php" -not -path "./tests*" | xargs wc -l
endre

19
যদি ডিরেক্টরি নামের কোনও শূন্যস্থান থাকে ... উপরের কমান্ডটি ব্যর্থ হয় !!
nitish712

474

অন্য একটি লাইনারের জন্য:

( find ./ -name '*.php' -print0 | xargs -0 cat ) | wc -l

স্পেস সহ নামগুলিতে কাজ করে, কেবল একটি সংখ্যা আউটপুট করে।


1
+1 ডিট্টো ... চিরতরে অনুসন্ধান করা হয়েছে ... অন্য সমস্ত "ফাইন্ড" কমান্ডগুলি কেবলমাত্র আসল ফাইলগুলির # টি ফিরিয়ে দিয়েছে .... -প্রিন্ট 0 স্টাফটি এখানে আমার জন্য প্রকৃত লাইন গণনা পেয়েছে !!! ধন্যবাদ!
রোনেডোগ

3
@ টোরবেনগান্ডটফট ব্রুউন - দেখুন man find.. xargs সহ মুদ্রণ0 -0 আপনাকে এমন ফাইলগুলিতে অপারেশন করতে দেয় যার নামে ফাঁকা স্থান বা অন্যান্য অদ্ভুত অক্ষর রয়েছে
শিজমো

2
@ TorbenGundtofte-Bruun - এছাড়াও, xargs -0-এ প্রিন্ট0 এর সাথে মিলে যায়, এটি ফাঁকা স্থানগুলি পরিচালনা করার জন্য এটি এক প্রকারের এনকোডিং / ডিকোডিং।
ত্রিস্তান রিড

7
: আপনি একটির বেশি নাম ফিল্টার প্রয়োজন হয়, তাহলে আমি দেখেছি যে, (খুঁজে পেতে MSYSGit সংস্করণের সাথে অন্তত), আপনি অতিরিক্ত ডান বন্ধনী প্রয়োজন ( find . \( -name '*.h' -o -name '*.cpp' \) -print0 | xargs -0 cat ) | wc -l
Zrax

1
@ ডিজাইনবিএড্রিয়ান: জার্নালিং গতি নয়, ক্র্যাশ পুনরুদ্ধারে সহায়তা করে। সম্ভবত আপনি ক্যাচিং বা খুব দ্রুত এইচডিডি করার কারণে ভাল পারফরম্যান্স দেখছেন।
jmh

398

যদি বাশের একটি সাম্প্রতিক সংস্করণ (বা জেডএসএইচ) ব্যবহার করা হয় তবে এটি অনেক সহজ:

wc -l **/*.php

বাশের শেলটিতে এটির জন্য globstarবিকল্পটি সেট করা দরকার, অন্যথায় **গ্লোব-অপারেটর পুনরাবৃত্ত হয় না। এই সেটিংটি সক্ষম করতে, ইস্যু করুন

shopt -s globstar

এই স্থায়ী করতে, এটি আরম্ভের ফাইল এক (যোগ ~/.bashrc, ~/.bash_profileইত্যাদি)।


7
আমি এটিকে সরলতার জন্য উত্সাহিত করছি, তবে আমি কেবল এটি উল্লেখ করতে চাই যে এটি ডিরেক্টরিগুলি পুনরাবৃত্তভাবে অনুসন্ধান করতে দেখা যাচ্ছে না, এটি কেবলমাত্র বর্তমান ডিরেক্টরিটির উপ-ডিরেক্টরিগুলি পরীক্ষা করে। এটি এসএল 6.3 এ রয়েছে।
গড্রিক সের

7
এটি আপনার শেল এবং আপনি যে বিকল্পগুলি সেট করেছেন তার উপর নির্ভর করে। এটি কাজ globstarকরার জন্য বাশ সেট করা প্রয়োজন ।
মাইকেল ওয়াইল্ড

2
@ পিটারসেনা, বর্তমান 3.9.8 কার্নেল সংরক্ষণাগার সহ, কমান্ডটি wc -l **/*.[ch]মোট 15195373 লাইন সন্ধান করে। আপনি এটিকে "খুব কম মান" বলে বিবেচনা করছেন কিনা তা নিশ্চিত নন। আবার, আপনার globstarবাশ সক্রিয় করা হয়েছে তা নিশ্চিত করা দরকার । আপনি চেক করতে পারেন shopt globstar। এটি স্পষ্টভাবে সক্ষম করতে, করুন shopt -s globstar
মাইকেল ওয়াইল্ড

5
@MichaelWild এটি একটি ভাল সমাধান, কিন্তু এটা ওভারফ্লো এখনও হবে ARG_MAXযদি আপনি একটি বড় সংখ্যা আছে .phpযেহেতু ফাইল, wcbuiltin করা হয় না।
মনিকা দয়া করে

1
অ্যালবার্টসামুয়েল না, আপনি উভয় পদ্ধতির দ্বারা উত্পাদিত ফাইলগুলির তালিকা তুলনা করতে চাই। আমার পদ্ধতিতে বিপুল সংখ্যক ফাইলের জন্য কাজ না করার সমস্যা রয়েছে, যেমনটি @ ব্রোসলো উল্লেখ করেছেন। গ্রহণযোগ্য উত্তর ব্যর্থ হবে যদি উত্পাদিত পাথগুলি findফাঁক করে রাখে। যে ব্যবহার করে সংশোধন করা যেতে পারে print0এবং --nullসঙ্গে findএবং xargsকল, যথাক্রমে।
মাইকেল ওয়াইল্ড

363

আপনি এই clocইউটিলিটিটি ব্যবহার করতে পারেন যা এই সঠিক উদ্দেশ্যে নির্মিত। এটি প্রতিটি ভাষায় প্রতিটি লাইনের পরিমাণের প্রতিবেদন করে এবং এর মধ্যে কতটি মন্তব্য রয়েছে সেগুলিও লিনাক্স, ম্যাক এবং উইন্ডোজে সিএলওসি উপলব্ধ।

ব্যবহার এবং আউটপুট উদাহরণ:

$ cloc --exclude-lang=DTD,Lua,make,Python .
    2570 text files.
    2200 unique files.                                          
    8654 files ignored.

http://cloc.sourceforge.net v 1.53  T=8.0 s (202.4 files/s, 99198.6 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
Javascript                    1506          77848         212000         366495
CSS                             56           9671          20147          87695
HTML                            51           1409            151           7480
XML                              6           3088           1383           6222
-------------------------------------------------------------------------------
SUM:                          1619          92016         233681         467892
-------------------------------------------------------------------------------

4
এটি একটি সুন্দর সরঞ্জাম যা দুর্দান্তভাবে চালায় এবং দ্রুত শেষের দিকে দরকারী পরিসংখ্যানগুলি প্রদান করে। এটা ভাল।
রব ফরেস্ট

4
দ্রষ্টব্য যে আপনি সাইগউইন (বা অন্যান্য অনুরূপ পোর্ট / পরিবেশ) উইন্ডোতে ইউনিক্স কমান্ডগুলি চালাতে পারেন। আমার কাছে, এই ধরণের অ্যাক্সেসটি এত দরকারী যে এটি অত্যন্ত প্রয়োজনীয়। একটি ইউনিক্স কমান্ড লাইনটি যাদুকরী। আমি বিশেষত পার্ল এবং নিয়মিত এক্সপ্রেশন পছন্দ করি।
কার্টিস ইয়ালাপ

সিএলওসি এবং এসএলওসকাউন্ট 2015 ম্যাকবুকের মাঝামাঝি সময়ে কাজ করে work নোট করুন তাদের সংখ্যা নিকটবর্তী তবে 127k জাভা অ্যান্ড্রয়েড প্রকল্পের জন্য ঠিক একই নয়। এছাড়াও আইওএস সমতুল্য 2x এলওসি ছিল নোট করুন; তাই, "খরচ" SLOCCount মধ্যে মেট্রিক বা বন্ধ হতে পারে (হয়তো আইওএস দেব করতে 2x কি অ্যান্ড্রয়েড দেব করতে :-)।
maxweber

2
আপনি কি এই প্রশ্নের শুরুতে সম্পাদনা বিবেচনা করবেন তা পরিষ্কার করার জন্য যে clocএটি কেবল পার্ল স্ক্রিপ্ট থেকে ক্রস প্ল্যাটফর্ম?
কাইল স্ট্র্যান্ড

ঠিক নিখুঁত, উইন্ডোজ ব্যাশে পাশাপাশি কাজ করে।
ইয়ুরস্নেম

100

ইউনিক্স-মতো সিস্টেমে এমন একটি সরঞ্জাম রয়েছে clocযা কোড পরিসংখ্যান সরবরাহ করে।

আমি আমাদের কোড বেসে একটি এলোমেলো ডিরেক্টরিতে দৌড়েছি এটি বলে:

      59 text files.
      56 unique files.                              
       5 files ignored.

http://cloc.sourceforge.net v 1.53  T=0.5 s (108.0 files/s, 50180.0 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
C                               36           3060           1431          16359
C/C++ Header                    16            689            393           3032
make                             1             17              9             54
Teamcenter def                   1             10              0             36
-------------------------------------------------------------------------------
SUM:                            54           3776           1833          19481
-------------------------------------------------------------------------------

2
@ মুজ টেকনিক্যালি সিমটাও এটি উইন্ডোজ ব্যবহারকারীদের সমাধান হিসাবে বিশেষত উল্লেখ করেছেন, লিনাক্স বা ইউনিক্সের কথা উল্লেখ করেননি।
টিম সেগুইন

5
আমার প্রশ্নের উত্তরে @ মুজ টেবিলটি তার উত্তরে সম্পাদিত হয়েছিল, এখন দুটি সত্যই একইরকম দেখাচ্ছে।
কলমারিয়াস

আমি এটা পছন্দ করি. ক্লক সত্যই ঝরঝরে। তবে সেই নামটির অর্থ কী?
মানোয়েল ভিলেলা

এটি এখন উইন্ডোজ এ! ধরে choco install cloc
নিচ্ছি আপনার

35

কতগুলি ফাইল রয়েছে বা কাঙ্ক্ষিত আউটপুট কী তা আপনি নির্দিষ্ট করেন নি। আপনি যেটা খুঁজছিলেন এটাই কি সেটা:

find . -name '*.php' | xargs wc -l

2
এটি কাজ করবে, যতক্ষণ না খুব বেশি ফাইল না থাকে: প্রচুর ফাইল থাকলে আপনি ফলস্বরূপ কয়েকটি লাইন পাবেন (xargs বিভিন্ন উপ-তালিকায় ফাইলগুলির তালিকা বিভক্ত করবে)
পাস্কাল মার্টিন

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

: আমি একটি ফাংশন, যেখানে একক উদ্ধৃতি খুব নিয়ন্ত্রণমূলক হয় ব্যবহারের জন্য এই খাপ খাওয়ানো প্রয়োজন go () { mkdir /tmp/go; [[ -f ./"$1" ]] && mv ./"$1" /tmp/go; (find ./ -type f -name "$*" -print0 | xargs -0 cat ) | wc -l; wc -l /tmp/go/*; mv /tmp/go/* . } ফলাফল slocount পাসে ছিল *.py, কিন্তু এটা জানেন না *.js, *.html
জালানব

31

তবুও অন্য একটি পরিবর্তন :)

$ find . -name '*.php' | xargs cat | wc -l

সম্পাদনা করুন: এটি ফাইল-বাই-ফাইলের পরিবর্তে মোট যোগফল দেবে।

সম্পাদনা 2: এটি কাজ করতে .পরে যুক্ত করুনfind


উভয় উত্তর লাইন যোগফল।
josh123a123

কমপক্ষে সাইগউইনে, আমার আরও ভাল ফলাফল হয়েছে:$ find -name \*\.php -print0 | xargs -0 cat | wc -l
মার্টিন হ্যাবারলি

ডারউইনে, এটি কেবল একটি দুর্দান্ত মোট দেয় find . -name '*.php' | xargs cat | wc -l: যেখানে এটি find . -name '*.php' | xargs wc -l
ফাইল-दर-

30

আশ্চর্যজনকভাবে অনুসন্ধানের -execএবং এর উপর ভিত্তি করে কোনও উত্তর নেই awk। এখানে আমরা যাচ্ছি:

find . -type f -exec wc -l {} \; | awk '{ SUM += $0} END { print SUM }'

এই স্নিপেট সমস্ত ফাইলের জন্য অনুসন্ধান করে ( -type f)। ফাইল এক্সটেনশন দ্বারা অনুসন্ধান করতে, ব্যবহার করুন -name:

find . -name '*.py' -exec wc -l '{}' \; | awk '{ SUM += $0; } END { print SUM; }'

2
কার্যকরীভাবে, এটি নিখুঁতভাবে কাজ করে তবে বৃহত তালিকাতে (লিনাক্স উত্স) এটি সত্যিই ধীর কারণ এটি সমস্ত ফাইলের জন্য 1 ডাব্লু ভিসার পরিবর্তে প্রতিটি ফাইলের জন্য ডাব্লুসি প্রক্রিয়া শুরু করে। আমি এই পদ্ধতিটি ব্যবহার করে 1.5 সেকেন্ডে 1.5 সেকেন্ড ব্যবহারের তুলনায় এটি টাইম করেছি find . -name '*.c' -print0 |xargs -0 wc -l। এটি বলেছে যে এই দ্রুত পদ্ধতিটি (কমপক্ষে ওএস এক্সে) বেশ কয়েকবার "মোট" মুদ্রণ শেষ করে যাতে সঠিক মোটের জন্য কিছু অতিরিক্ত ফিল্টারিংয়ের প্রয়োজন হয় (আমি আমার উত্তরে বিশদ পোস্ট করেছি)।
ডগ রিচার্ডসন

এতে সীমাহীন সংখ্যক ফাইলের জন্য কাজ করার সুবিধা রয়েছে। সাবাশ!
ekscrypto

1
বিপুল পরিমাণে জিবি এবং ফাইলগুলির সাথে কাজ করার পরে এটি আরও ভাল সমাধান। এক করছেন wcএকটি একটি ফর্ম উপর catধীর কারণ সিস্টেম প্রথম লাইন (jsons এর 200GB, 12k ফাইলগুলির সাথে পরীক্ষিত) গণনা শুরু করার জন্য সব গিগাবাইট প্রক্রিয়া হবে। করছেন wcপ্রথম তারপর ফলাফলের গণনা পর্যন্ত দ্রুততর
ulkas

1
@ ডৌগ্রিচার্ডসন, আপনি এর পরিবর্তে এটি বিবেচনা করতে পারেন: find . -type f -exec wc -l {} \+বা find . -name '*.py' -type f -exec wc -l {} \+ যা আউটপুট শেষে মোট মুদ্রণ করে। আপনার আগ্রহী সমস্ত যদি মোট হয় তবে আপনি কিছুটা এগিয়ে যেতে পারেন এবং ব্যবহার করতে পারেন tail: find . -type f -exec wc -l {} \+ | tail -1বাfind . -name '*.py' -type f -exec wc -l {} \+ | tail -1
জ্যামিজেগ

25

আমার জন্য আরও সাধারণ এবং সহজ, ধরুন আপনাকে আলাদা আলাদা নাম এক্সটেনশনের ফাইলগুলি গণনা করতে হবে (বলুন, নেটিভরাও)

wc $(find . -type f | egrep "\.(h|c|cpp|php|cc)" )

মতামতের জন্য আপনাকে ধন্যবাদ, আমি এটি সংশোধন করেছি।


6
এটি আপনার মতামতটি পুরোপুরি কার্যকর করে না। অনুসন্ধান . -নম ' । [am]' সন্ধান করার মতো। -নম ' । [a | মি]' দুজনেই মি। বা
.a

1
তবে দ্বিতীয়টি শেষ হওয়া ফাইলগুলিও খুঁজে পাবে , যদি কোন. সুতরাং [এইচ। সি | সিপিপি | পিএইচপি | সিসি] [এইচসিপি |] এর সমান হতে পারে।
ওসামাবিনলগিন

ব্যাকটিকগুলি অবহেলা করা হয়, পছন্দ করুন$()
স্যান্ডবুর্গ

এটি সাইগউইনের অধীনে কাজ করে। অবশ্যই, "সি: \" ড্রাইভটি সাইগউইন কনভেনশনটি অনুসরণ করতে হবে, উদাহরণস্বরূপ: ডাব্লুসি $ (সন্ধান করুন / সাইগড্রাইভ / সি // সোমারউইনফোল্ডারড /-টাইপ চ | egrep "\। (এইচ | সি | সিপিপি | পিএইচপি | পিপিপি) | সিসি) ")
খ্রিস্টান জিঙ্গ্রাস

21

POSIX

এখানে অন্যান্য উত্তরগুলির মতো নয়, এগুলি কোনও পসিক্স সিস্টেমে, কোনও সংখ্যক ফাইলের জন্য এবং যে কোনও ফাইলের নাম (যেখানে উল্লিখিত রয়েছে ব্যতীত) কাজ করে।


প্রতিটি ফাইলের লাইন:

find . -name '*.php' -type f -exec wc -l {} \;
# faster, but includes total at end if there are multiple files
find . -name '*.php' -type f -exec wc -l {} +

প্রতিটি ফাইলের রেখাগুলি ফাইল পথ অনুসারে সাজানো

find . -name '*.php' -type f | sort | xargs -L1 wc -l
# for files with spaces or newlines, use the non-standard sort -z
find . -name '*.php' -type f -print0 | sort -z | xargs -0 -L1 wc -l

প্রতিটি ফাইলের রেখাগুলি, অবতরণকারী লাইনের সংখ্যার অনুসারে বাছাই করা

find . -name '*.php' -type f -exec wc -l {} \; | sort -nr
# faster, but includes total at end if there are multiple files
find . -name '*.php' -type f -exec wc -l {} + | sort -nr

সমস্ত ফাইলের মোট লাইন

find . -name '*.php' -type f -exec cat {} + | wc -l

19

ডিরেক্টরিতে কোডের রেখাগুলি গণনা করার জন্য স্লোকাউন্ট নামে একটি ছোট্ট সরঞ্জাম রয়েছে । এটি লক্ষ করা উচিত যে এটি খালি রেখাগুলি / মন্তব্যগুলিকে উপেক্ষা করার সাথে সাথে এটি আপনার চেয়ে বেশি কাজ করে, প্রোগ্রামিং ভাষার প্রতি ফলাফলগুলিকে গোষ্ঠী করে এবং কিছু পরিসংখ্যান গণনা করে।


উইন্ডোগুলির জন্য, লোকমেট্রিকগুলি কাজটি করে
ক্যামিল

15

আপনি যা চান তা একটি সরল forলুপ:

total_count=0
for file in $(find . -name *.php -print)
do
    count=$(wc -l $file)
    let total_count+=count
done
echo "$total_count"

3
এই ওভারকিলটি উত্তরগুলির সাথে তুলনা করে যা প্রস্তাব করে xargs?
নাথান ফেলম্যান

5
না, নাথান Xargs উত্তরগুলি অগত্যা একক সংখ্যা হিসাবে গণনা মুদ্রণ করবে না। এটি কেবলমাত্র একগুচ্ছ সাবটোটাল মুদ্রণ করতে পারে।
রব কেনেডি

3
যদি ফাইলের নামগুলিতে ফাঁক থাকে তবে এই প্রোগ্রামটি কী করবে? নতুন লাইনের কথা কী? ;-)
পাওয়ে পোলেভিজ

38
যদি আপনার ফাইলের নামগুলিতে নতুন লাইন থাকে তবে আমি বলতে পারি আপনার বড় সমস্যা রয়েছে।
Kzqai

2
@ এন্নুইকিলার এটির সাথে সম্পর্কিত সমস্যার সংখ্যা, সবার আগে এটি হোয়াইটস্পেসযুক্ত ফাইলগুলিতে ভেঙে যায়। IFS=$'\n'লুপের আগে সেট করা অন্তত তাদের নামে নতুন লাইনের ফাইলগুলি ছাড়াও সকলের জন্য এটি ঠিক করে দেবে। দ্বিতীয়ত, আপনি উদ্ধৃতি দিচ্ছেন না '*.php', সুতরাং এটি শেল দ্বারা প্রসারিত findহবে এবং হবে না এবং এরগো আসলে পিএইচপি ফাইলগুলিকে উপ-ডিরেক্টরিতে পাওয়া যাবে না। এছাড়াও -printঅপ্রয়োজনীয়, যেহেতু এটি অন্যান্য কর্ম অনুপস্থিতিতে উহ্য নেই।
মনিকা পুনরায় ইনস্টল করুন

12

শুধুমাত্র উত্সের জন্য:

wc `find`

ফিল্টার করতে, কেবল গ্রেপ ব্যবহার করুন

wc `find | grep .php$`

11

একটি সহজ সরল যা দ্রুত হবে, সমস্ত অনুসন্ধান / ফিল্টারিং শক্তি ব্যবহার করবে find, যখন খুব বেশি ফাইল (সংখ্যা যুক্তি ওভারফ্লো) থাকে তখন ব্যর্থ xargsহবে না, ব্যবহার না করেই তাদের নামে মজার চিহ্ন সহ ফাইলগুলির সাথে সূক্ষ্ম কাজ করবে অকার্যকরভাবে বহিরাগত কমান্ডের সংখ্যার সংখ্যা ( এর +জন্য ধন্যবাদ )। আপনি এখানে যান:find-exec

find . -name '*.php' -type f -exec cat -- {} + | wc -l

2
আমি নিজেই এর বৈকল্পিক পোস্ট করতে চলেছিলাম ( \;পরিবর্তে +আমি এটি সম্পর্কে অবগত ছিলাম না), এই উত্তরটি সঠিক উত্তর হওয়া উচিত।
কে কে কোয়ান

7

আমি জানি প্রশ্ন হিসাবে ট্যাগ করা হয় , তবে মনে হচ্ছে আপনি যে সমস্যার সমাধান করার চেষ্টা করছেন সেটিও পিএইচপি সম্পর্কিত।

সেবাস্তিয়ান বার্গম্যান পিএইচপিএলওসি নামে একটি সরঞ্জাম লিখেছিলেন যা আপনি যা চান তা করে এবং তার উপরে আপনাকে একটি প্রকল্পের জটিলতার একটি ওভারভিউ সরবরাহ করে। এটি তার প্রতিবেদনের একটি উদাহরণ:

Size
  Lines of Code (LOC)                            29047
  Comment Lines of Code (CLOC)                   14022 (48.27%)
  Non-Comment Lines of Code (NCLOC)              15025 (51.73%)
  Logical Lines of Code (LLOC)                    3484 (11.99%)
    Classes                                       3314 (95.12%)
      Average Class Length                          29
      Average Method Length                          4
    Functions                                      153 (4.39%)
      Average Function Length                        1
    Not in classes or functions                     17 (0.49%)

Complexity
  Cyclomatic Complexity / LLOC                    0.51
  Cyclomatic Complexity / Number of Methods       3.37

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


7

অনুমান করে কেউ কখনও এটিকে পেছনে সমাধিস্থ হতে দেখবে না ... তবুও এখন পর্যন্ত উত্তরগুলির কোনওটিই ফাঁকা স্থান ফাইল ফাইলের সমস্যায় পড়েনি। অতিরিক্তভাবে, xargsগাছের মোট পাথের দৈর্ঘ্য শেল পরিবেশের আকারের সীমা ছাড়িয়ে গেলে (লিনাক্সের কয়েকটি মেগাবাইটের ডিফল্ট) অবিচ্ছিন্ন। এই সমস্যাগুলিকে সুন্দর প্রত্যক্ষ পদ্ধতিতে সমাধান করার জন্য এখানে একটি রয়েছে। সাবশেল স্পেস সহ ফাইলগুলির যত্ন নেয়। awkপৃথক ফাইলের প্রবাহ সমগ্র wcআউটপুট, তাই সঞ্চয়ের সীমা ছাড়িয়ে কখনো ঢেকে রাখবে। এটি execকেবলমাত্র ফাইলগুলিতে সীমাবদ্ধ করে (ডিরেক্টরিগুলি এড়িয়ে চলে):

find . -type f -name '*.php' -exec bash -c 'wc -l "$0"' {} \; | awk '{s+=$1} END {print s}' 

6

ডাব্লুসি-এল? আরও ভাল জিআরপি-সি ^ ব্যবহার করুন ^

wc -l? ভুল! ডাব্লুসি কমান্ড নতুন লাইন কোড গণনা করে, লাইন নয় ! যখন ফাইলের শেষ লাইনটি নতুন লাইন কোডের সাথে শেষ হয় না, এটি গণনা করা হবে না!

আপনি যদি এখনও গণনা রেখাগুলি চান তবে গ্রেপ-সি ^ ব্যবহার করুন , সম্পূর্ণ উদাহরণ:

#this example prints line count for all found files
total=0
find /path -type f -name "*.php" | while read FILE; do
     #you see use grep instead wc ! for properly counting
     count=$(grep -c ^ < "$FILE")
     echo "$FILE has $count lines"
     let total=total+count #in bash, you can convert this for another shell
done
echo TOTAL LINES COUNTED:  $total

শেষ অবধি, ডাব্লুসি-এল ফাঁদটির জন্য নজর রাখুন (লাইনগুলি নয়, প্রবেশের গণনা রয়েছে !!!)


দয়া করে একটি লাইনের POSIX সংজ্ঞাটি পড়ুন । সঙ্গে grep -c ^আপনি সংখ্যা বেড়ে চলেছে করছি অসম্পূর্ণ লাইন এবং এই ধরনের অসম্পূর্ণ লাইন একটি থাকতে পারে না টেক্সট ফাইল
gniourf_gniourf 5'15

2
আমি এটা জানি. অনুশীলনে কেবল শেষ লাইন অসম্পূর্ণ হতে পারে কারণ এটি EOL পায় নি। আইডিয়া অসম্পূর্ণ এক সহ সমস্ত লাইন গণনা করছে। এটি খুব ঘন ঘন ভুল, কেবল সম্পূর্ণ লাইন গণনা করা। গণনার পরে আমরা ভাবছি "কেন আমি শেষ লাইনটি মিস করলাম ???"। এটি সঠিকভাবে কীভাবে করা যায় তার উত্তর, এবং রেসিপি।
জিনিক

অথবা, যদি আপনি একটি এক মাছ ধরার নৌকা চাই: find -type f -name '*.php' -print0 | xargs -0 grep -ch ^ | paste -sd+ - | bc বিকল্প জন্য এখানে দেখুন bc: stackoverflow.com/q/926069/2400328
techniao

5

এটি zsh গ্লোবগুলির সাথে খুব সহজ:

wc -l ./**/*.php

আপনি যদি ব্যাশ ব্যবহার করছেন তবে আপনার আপগ্রেড করতে হবে। বাশ ব্যবহার করার কোনও কারণ নেই।


4

খুব সহজভাবে

find /path -type f -name "*.php" | while read FILE
do
    count=$(wc -l < $FILE)
    echo "$FILE has $count lines"
done

1
ফাইলের
কোনও

4

আপনি যদি নিজের ফলাফলগুলি লাইন সংখ্যা অনুসারে বাছাই করতে চান তবে আপনি প্রথম উত্তরে স্রেফ যুক্ত ( | sortবা অবতরণ ক্রমের জন্য) যুক্ত করতে পারেন:| sort -r-r

find . -name '*.php' | xargs wc -l | sort -r

1
যেহেতু এর আউটপুট xargs wc -lসংখ্যাসূচক, একটিকে আসলে ব্যবহার করতে হবে sort -nবা sort -nr
ডাস্টিন ইঙ্গ্রাম

4

জন্য উইন্ডোজ , সহজ এবং দ্রুত টুল LocMetrics


উইন্ডোজ যদি ব্যাশ ব্যবহার করে তবে ওপিতে এটির সম্ভাবনা খুব কম।

1
@ ভনেসা এমসিএইএল প্রশ্নের শিরোনাম এবং বর্ণনা উভয়টিরই পরিষ্কারভাবে ইউনিক্স-সমাধানের প্রয়োজন নেই। সুতরাং উইন্ডোজ ভিত্তিক সমাধান গ্রহণযোগ্য। এছাড়াও আমি যখন অনুরূপ সমাধানের সন্ধান করছিলাম তখন গুগল আমাকে এই পৃষ্ঠায় দেখিয়েছিল।
ওয়ালভ

এই মন্তব্যটি আমাকে সাহায্য করেছে। আমি এটি চেষ্টা করেছিলাম এবং এটি ভাল কাজ করে।
অ্যালান এফ

4

কিছু আলাদা:

wc -l `tree -if --noreport | grep -e'\.php$'`

এটি কার্যকরভাবে কাজ করে তবে আপনার *.phpবর্তমান ফোল্ডারে কমপক্ষে একটি ফাইল বা এর একটি সাবফোল্ডার বা অন্য কোনও wcস্টল থাকা দরকার


এছাড়াও ARG_MAX উপচে পড়তে পারে
মার্ক কে কোয়ান

4

আপনি যদি লিনাক্সে থাকেন (এবং আমি এটি আপনিই নিই) তবে আমি আমার সরঞ্জামটি বহুগ্লোটের প্রস্তাব দিই । এটা তোলে নাটকীয়ভাবে যতো তাড়াতাড়ি হয় sloccountবা clocতা চেয়ে বেশি featureful হয় sloccount

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

poly .

অথবা

poly

সুতরাং এটি কিছু সংশ্লেষিত বাশ স্ক্রিপ্টের চেয়ে অনেক বেশি ব্যবহারকারী-বান্ধব।


4

টোকাই সরঞ্জামটি কোনও ডিরেক্টরিতে কোড সম্পর্কিত পরিসংখ্যান প্রদর্শন করে। টোকেই ফাইলগুলির সংখ্যা, সেই ফাইলগুলির মধ্যে মোট লাইন এবং কোড, ভাষাগুলি অনুসরন করে মন্তব্যগুলি এবং ফাঁকা স্থান প্রদর্শন করবে। টোকেই ম্যাক, লিনাক্স এবং উইন্ডোজেও উপলব্ধ।

টোকাইয়ের আউটপুটটির উদাহরণ নিম্নরূপ:

$ tokei
-------------------------------------------------------------------------------
 Language            Files        Lines         Code     Comments       Blanks
-------------------------------------------------------------------------------
 CSS                     2           12           12            0            0
 JavaScript              1          435          404            0           31
 JSON                    3          178          178            0            0
 Markdown                1            9            9            0            0
 Rust                   10          408          259           84           65
 TOML                    3           69           41           17           11
 YAML                    1           30           25            0            5
-------------------------------------------------------------------------------
 Total                  21         1141          928          101          112
-------------------------------------------------------------------------------

রিপোজিটরিতে README ফাইলের নির্দেশাবলী অনুসরণ করে টোকেই ইনস্টল করা যেতে পারে ।


1
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত
এলিজাস

3

আপনার যদি কেবলমাত্র মোট লাইনের দরকার হয় তবে আসুন আপনার পিএইচপি ফাইলগুলি আপনি উইন্ডোতে খুব সাধারণ একটি লাইন কমান্ড ব্যবহার করতে পারেন যদি আপনি GnuWin32 ইনস্টল করেন। এটার মত:

cat `/gnuwin32/bin/find.exe . -name *.php` | wc -l

আপনাকে ঠিক কোথায় সন্ধান করতে হবে তা নির্ধারণ করতে হবে অন্যথায় উইন্ডোজ প্রদত্ত FIND.EXE (পুরানো ডস-এর মতো কমান্ডগুলি থেকে) কার্যকর করা হবে, যেহেতু এটি সম্ভবত পরিবেশ প্যাথ-এ GnuWin32 এর আগে এবং এর বিভিন্ন পরামিতি এবং ফলাফল রয়েছে।

দয়া করে নোট করুন যে উপরের কমান্ডটিতে আপনার একক উদ্ধৃতি নয়, ব্যাক-কোট ব্যবহার করা উচিত।


উপরের উদাহরণে আমি উইন্ডোজের জন্য সেমিডি.এক্স.এক্স.এক্স.এক্সের পরিবর্তে ব্যাশ ব্যবহার করছি তাই এখানে ফরোয়ার্ড স্ল্যাশ রয়েছে "/" এবং পিছনে স্ল্যাশ "\" নয়।
নেভেন বায়ানভ

3

প্রথমে দীর্ঘতম ফাইলগুলি সরবরাহ করা (উদাহরণস্বরূপ: এই দীর্ঘ ফাইলগুলির জন্য কিছু রিফ্যাক্টরিং প্রেমের দরকার আছে?) এবং কিছু বিক্রেতার ডিরেক্টরি বাদ দিয়ে:

 find . -name '*.php' | xargs wc -l | sort -nr | egrep -v "libs|tmp|tests|vendor" | less

3

আপনি যদি এটি সহজ রাখতে চান তবে মধ্যস্থতাকে কেটে ফেলুন এবং কেবলমাত্র wcসমস্ত ফাইলের নাম দিয়ে কল করুন :

wc -l `find . -name "*.php"`

বা আধুনিক বাক্য গঠনতে:

wc -l $(find . -name "*.php")

ডিরেক্টরি নাম বা ফাইলের নামগুলির কোনওটিতে কোনও স্থান ফাঁকা না হওয়া পর্যন্ত কাজ করে। এবং যতক্ষণ না আপনার কাছে কয়েক হাজার ফাইল রয়েছে (আধুনিক শেলগুলি সত্যিই দীর্ঘ কমান্ড লাইন সমর্থন করে)। আপনার প্রকল্পে files৪ টি ফাইল রয়েছে, তাই আপনার বাড়ার জন্য প্রচুর জায়গা পেয়েছে।


আমার এটা ভাল লেগেছে! আপনি যদি হাইব্রিড সি / সি ++ পরিবেশে থাকেন:wc -l `find . -type f \( -name "*.cpp" -o -name "*.c" -o -name "*.h" \) -print`
ব্র্যাম

অবাক হয়ে গিয়েছিল এটি শীর্ষ উত্তর ছিল না
এমএস 4720

3

কমান্ডগুলি মনে রাখার জন্য আপনার এই সমস্ত জটিল এবং কঠিন প্রয়োজন নেই। আপনার কেবল লাইন-কাউন্টার নামে একটি সরঞ্জাম প্রয়োজন ।

একটি দ্রুত ওভারভিউ

এভাবেই আপনি সরঞ্জামটি পান

$ pip install line-counter

lineবর্তমান ডিরেক্টরি অধীনে ফাইল সংখ্যা এবং লাইন গণনা পেতে কমান্ড ব্যবহার করুন (পুনরাবৃত্তভাবে)

$ line
Search in /Users/Morgan/Documents/Example/
file count: 4
line count: 839

আপনি যদি আরও বিশদ চান, কেবল ব্যবহার করুন line -d

$ line -d
Search in /Users/Morgan/Documents/Example/
Dir A/file C.c                                             72
Dir A/file D.py                                           268
file A.py                                                 467
file B.c                                                   32
file count: 4
line count: 839

এবং এই সরঞ্জামটির সেরা অংশটি হ'ল আপনি এতে .gitignoreকনফিগার ফাইলের মতো যুক্ত করতে পারেন । আপনি '.gitignore' এ যা করেন ঠিক তেমন ফাইলগুলি গণনা করতে বা তা উপেক্ষা করার জন্য আপনি বিধিগুলি সেট করতে পারেন।

আরও বিবরণ এবং ব্যবহার এখানে: https://github.com/MorganZhang100/line-counter


3

ফাইলগুলি যদি খুব বেশি হয় তবে মোট লাইন গণনা সন্ধান করা আরও ভাল।

find . -name '*.php' | xargs wc -l | grep -i ' total' | awk '{print $1}'

2

কমপক্ষে ওএস এক্স-তে, + xarg + wc কমান্ডগুলি উত্তরগুলির মধ্যে কয়েকটি তালিকাভুক্ত বড় তালিকাতে বেশ কয়েকটি বার "মোট" মুদ্রণ করে, এবং কোনও সম্পূর্ণ মোট দেওয়া হয়নি। আমি নিম্নলিখিত কমান্ডটি ব্যবহার করে .c ফাইলের জন্য একক মোট পেতে সক্ষম হয়েছি:

find . -name '*.c' -print0 |xargs -0 wc -l|grep -v total|awk '{ sum += $1; } END { print "SUM: " sum; }'

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