एक निर्देशिका में कोड की सभी पंक्तियों को पुनरावर्ती रूप से कैसे गिना जाए?


1621

हमें एक PHP एप्लिकेशन मिला है और एक विशिष्ट निर्देशिका और उसके उपनिर्देशिकाओं के तहत कोड की सभी पंक्तियों को गिनना चाहता है। हमें टिप्पणियों को अनदेखा करने की आवश्यकता नहीं है, क्योंकि हम केवल एक मोटा विचार प्राप्त करने की कोशिश कर रहे हैं।

wc -l *.php 

यह कमांड किसी दिए गए डायरेक्टरी के भीतर बहुत अच्छा काम करता है, लेकिन उपनिर्देशिकाओं की उपेक्षा करता है। मैं सोच रहा था कि यह काम कर सकता है, लेकिन यह 74 वापस आ रहा है, जो निश्चित रूप से ऐसा नहीं है ...

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

सभी फाइलों में फीड करने के लिए सही सिंटैक्स क्या है?

जवाबों:


2647

प्रयत्न:

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

SLOCCount टूल भी मदद कर सकता है।

यह जो भी पदानुक्रम आप इसे इंगित करता है, साथ ही कुछ अतिरिक्त आँकड़े के लिए कोड गणना की एक सटीक स्रोत लाइनें देगा।

क्रमबद्ध आउटपुट:

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


31
cloc.sourceforge.net स्लोकाउंट के विकल्प के रूप में देखने के लायक हो सकता है (अधिक भाषाएँ लेकिन कम informations)
AsTeR

31
फ़ाइलों को भी शामिल करें:find . -name '*.php' -o -name '*.inc' | xargs wc -l
rymo

52
यह कई फाइलों के होने पर एक से अधिक नंबर प्रिंट करेगा (क्योंकि wcकई बार चलाया जाएगा। साथ ही कई विशेष फ़ाइल नामों को हैंडल नहीं करता है।
l0b0

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

19
यदि निर्देशिका नाम में कोई रिक्त स्थान है ... तो उपरोक्त आदेश विफल रहता है !!
नाइटिश nit१२

474

एक अन्य लाइनर के लिए:

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

रिक्त स्थान वाले नामों पर काम करता है, केवल एक नंबर आउटपुट करता है।


1
+1 डिट्टो ... हमेशा के लिए खोजा गया ... अन्य सभी "खोज" आदेशों ने केवल वास्तविक फ़ाइलों के # वापस कर दिया .... -प्रिंट 0 सामान यहां मेरे लिए वास्तविक लाइन काउंट मिला !!! धन्यवाद!
रॉनडॉग

3
@ TorbenGundtofte-Bruun - देखें man find.. xargs -0 के साथ Print0 आपको उन फाइलों पर काम करने की सुविधा देता है जिनके नाम में रिक्त स्थान या अन्य अजीब अक्षर हैं
Shizzmo

2
@ TorbenGundtofte-Bruun -, -0 में xargs के -0 से मेल खाती है, यह रिक्त स्थान को संभालने के लिए एन्कोडिंग / डिकोडिंग की तरह है।
ट्रिस्टन रीड

7
यदि आपको एक से अधिक नाम फ़िल्टर की आवश्यकता है, तो मैंने पाया है कि (कम से कम MSYSGit संस्करण को खोजने के साथ), आपको अतिरिक्त ( find . \( -name '*.h' -o -name '*.cpp' \) -print0 | xargs -0 cat ) | wc -l
पार्न्स की

1
@DesignbyAdrian: जर्नलिंग क्रैश रिकवरी में मदद करता है, गति नहीं। यह संभावना है कि आप कैशिंग या बहुत तेज़ एचडीडी के कारण अच्छा प्रदर्शन देख रहे हैं।
JMH

398

यदि बैश (या ZSH) के एक हालिया संस्करण का उपयोग कर रहे हैं, तो यह बहुत सरल है:

wc -l **/*.php

बैश शेल में इसे globstarसेट करने के विकल्प की आवश्यकता होती है , अन्यथा **ग्लोब-ऑपरेटर पुनरावर्ती नहीं होता है। इस सेटिंग को सक्षम करने के लिए, जारी करें

shopt -s globstar

इसे स्थायी बनाने के लिए, इसे आरंभिक फ़ाइलों ( ~/.bashrc, ~/.bash_profileआदि) में से एक में जोड़ें ।


7
मैं इसे सादगी के लिए बढ़ा रहा हूं, हालांकि मैं केवल यह बताना चाहता हूं कि यह निर्देशिकाओं को पुन: खोज करने के लिए प्रकट नहीं होता है, यह केवल वर्तमान निर्देशिका के उपनिर्देशिकाओं की जांच करता है। यह SL6.3 पर है।
गोड्रिक सीयर

7
यह आपके शेल और आपके द्वारा सेट किए गए विकल्पों पर निर्भर करता है। इसके लिए कार्य करने के लिए बैश की आवश्यकता होती globstarहै
माइकल वाइल्ड

2
@PeterSenna, वर्तमान 3.9.8 कर्नेल संग्रह के साथ, कमांड wc -l **/*.[ch]में कुल 15195373 लाइनें मिलती हैं। यकीन नहीं है कि क्या आप "बहुत कम मूल्य" मानते हैं। फिर, आपको यह सुनिश्चित करने की आवश्यकता है कि आपने globstarबैश में सक्षम किया है। आप के साथ जाँच कर सकते हैं shopt globstar। इसे स्पष्ट रूप से सक्षम करने के लिए, करें shopt -s globstar
माइकल वाइल्ड

5
@MichaelWild यह एक अच्छा समाधान है, लेकिन यह तब भी ओवरफ्लो होगा ARG_MAXजब आपके पास बड़ी संख्या में .phpफाइलें होंगी , क्योंकि wcयह बिल्ट नहीं है।
मोनिका प्लीज

1
@AlbertSamuel नहीं, आपको दोनों विधियों द्वारा निर्मित फ़ाइलों की सूची की तुलना करने की आवश्यकता होगी। मेरी विधि में बड़ी संख्या में फाइलों के काम न करने की समस्या है, जैसा कि @BroSlow द्वारा बताया गया है। यदि findरिक्त स्थान द्वारा निर्मित पथ में स्वीकृत उत्तर विफल हो जाएगा । क्रमशः और कॉल के साथ print0और उपयोग करके इसे ठीक किया जा सकता है । --nullfindxargs
माइकल वाइल्ड

363

आप clocउपयोगिता का उपयोग कर सकते हैं जो इस सटीक उद्देश्य के लिए बनाई गई है। यह प्रत्येक भाषा में लाइनों की प्रत्येक मात्रा की रिपोर्ट करता है, साथ में उनमें से कितनी टिप्पणियां हैं आदि। 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
ध्यान दें कि आप साइबरविन (या अन्य समान पोर्ट / वातावरण) का उपयोग करके विंडोज पर यूनिक्स कमांड चला सकते हैं। मेरे लिए, इस तरह की पहुँच का इतना उपयोगी होना, यह एक आवश्यकता है। एक यूनिक्स कमांड लाइन जादुई है। मैं विशेष रूप से पर्ल और नियमित अभिव्यक्ति पसंद करता हूं।
कर्टिस येलोप

CLOC और SLOCCount मध्य 2015 की मैकबुक पर ठीक काम करते हैं। ध्यान दें कि उनकी संख्या करीब है लेकिन 127k जावा एंड्रॉइड प्रोजेक्ट के लिए बिल्कुल समान नहीं है। यह भी ध्यान दें कि iOS समतुल्य 2x 2x LoC था; इसलिए, SLOCCount में "लागत" मीट्रिक बंद हो सकती है (या शायद iOS देव 2x को एंड्रॉइड
डे

2
क्या आप इस प्रश्न की शुरुआत को संपादित करने पर विचार करेंगे ताकि यह स्पष्ट हो सके कि clocयह क्रॉस-प्लेटफॉर्म है क्योंकि यह केवल पर्ल स्क्रिप्ट है?
काइल स्ट्रैंड

बिल्कुल सही, निश्चित रूप से विंडोज बैश में ठीक काम करता है।
यूरिस्मिन

100

UNIX- जैसी प्रणालियों पर, एक उपकरण होता है, 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
@moose तकनीकी रूप से सिमटाओ ने इसे विशेष रूप से विंडोज़ उपयोगकर्ताओं के लिए एक समाधान के रूप में उल्लेख किया है, जिसमें लिनक्स या यूनिक्स का उल्लेख नहीं है।
टिम सेगिन

5
@moose टेबल मेरे जवाब से बहुत बाद में उनके उत्तर में संपादित किया गया था, अब दोनों वास्तव में समान दिखते हैं।
कलमरियस

मुझें यह पसंद है। क्लोक वास्तव में साफ है। लेकिन उस नाम का क्या मतलब है?
मनोएल विलेला

यह अब विंडोज पर भी है! यह मानते हुए कि आपको चॉकलेट मिल गई है :choco install cloc
icc97

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
jalanb

31

फिर भी एक और बदलाव :)

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

संपादित करें: यह फ़ाइल-दर-फ़ाइल के बजाय कुल योग देगा।

Edit2: इसे काम करने के .बाद जोड़ें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 wc प्रक्रिया के बजाय प्रत्येक फ़ाइल के लिए एक wc प्रक्रिया शुरू कर रहा है। मैंने इस विधि का उपयोग करते हुए इसे 1.5 सेकंड की तुलना में 31 सेकंड पर समय दिया find . -name '*.c' -print0 |xargs -0 wc -l। उस ने कहा, यह तेज़ विधि (कम से कम ओएस एक्स पर), कई बार "कुल" छपाई को समाप्त करती है इसलिए उचित कुल प्राप्त करने के लिए कुछ अतिरिक्त फ़िल्टरिंग की आवश्यकता होती है (मैंने अपने उत्तर में विवरण पोस्ट किया है)।
डग रिचर्डसन

इसमें असीमित संख्या में फ़ाइलों के लिए काम करने का लाभ है। बहुत बढ़िया!
ekscrypto

1
बड़ी मात्रा में GB और फ़ाइलों के साथ काम करने के बाद यह बेहतर समाधान है। एक के wcएक रूप पर करना catधीमा है क्योंकि सिस्टम को सबसे पहले लाइनों को गिनने के लिए सभी जीबी की प्रक्रिया करनी चाहिए (200GB jsons, 12k फ़ाइलों के साथ परीक्षण किया गया)। कर wcपहले तो परिणाम गिनती अब तक तेजी से होता है
ulkas

1
@DougRichardson, आप इसके बजाय इस पर विचार कर सकते हैं: 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
JamieJag

25

मेरे लिए अधिक सामान्य और सरल, मान लीजिए कि आपको अलग-अलग नाम एक्सटेंशन की फ़ाइलों की गणना करने की आवश्यकता है (जैसे, मूल निवासी भी)

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

प्रतिक्रिया के लिए धन्यवाद, मैंने इसे सही किया है।


6
यह वह नहीं है जो आप सोचते हैं। खोजो। -नाम ' । [am]' खोजने के लिए समान है। -नाम ' । [a | m]' दोनों में सभी फाइलें
मिलेंगी

1
लेकिन दूसरे में भी समाप्त होने वाली फाइलें मिलेंगी | , यदि कोई। तो [h | c | cpp | php | cc] का अंत [hcp |] जैसा ही होता है।
ओसामाबिनलोगिन

बैकटिक्स को हटा दिया गया है, पसंद करें$()
सैंडबर्ग

यह Cygwin के तहत काम करता है। बेशक, "C: \" ड्राइव को उदाहरण के लिए, साइबरविन कन्वेंशन का अनुसरण करना है: wc $ (Find / cygdrive / c // SomeWindowsFolderj / -type f | egrep "\! (H। C। Cpp। Php) | cc) ")
क्रिश्चियन गिंग्रास

21

POSIX

यहां अधिकांश अन्य उत्तरों के विपरीत, ये किसी भी 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
इसके साथ @ennuikiller मुद्दों की संख्या, सबसे पहले यह व्हाट्सएप वाली फाइलों पर टूटेगा। IFS=$'\n'लूप से पहले सेट करना कम से कम सभी के लिए इसे ठीक कर देगा, लेकिन उनके नाम की नई लाइनों वाली फाइलें। दूसरा, आप उद्धृत नहीं कर रहे हैं '*.php', इसलिए यह शेल द्वारा विस्तारित हो जाएगा और नहीं find, और एर्गो वास्तव में उपनिर्देशिका में php फ़ाइलों में से कोई भी नहीं मिलेगा। यह भी -printनिरर्थक है, क्योंकि यह अन्य कार्यों की अनुपस्थिति में निहित है।
मोनिका प्लीज

12

केवल स्रोतों के लिए:

wc `find`

फ़िल्टर करने के लिए, बस grep का उपयोग करें

wc `find | grep .php$`

11

एक सीधा जो तेज होगा, सभी खोज / फ़िल्टरिंग पावर का उपयोग करेगा find, तब विफल न हो जब बहुत सारी फाइलें (संख्या तर्क अतिप्रवाह) हों, उनके नाम पर मजाकिया प्रतीकों वाली फ़ाइलों के साथ ठीक काम करें, बिना उपयोग किए xargs, लॉन्च नहीं करेंगे बाहरी आदेशों की बेकार उच्च संख्या ( 's के +लिए धन्यवाद )। हेयर यू गो:find-exec

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

2
मैं स्वयं इसका एक संस्करण पोस्ट करने वाला था ( \;इसके बजाय +जैसा कि मुझे इसकी जानकारी नहीं थी), यह उत्तर सही उत्तर होना चाहिए।
मार्क के कोवान

7

मुझे पता है कि प्रश्न को टैग किया गया है , लेकिन ऐसा लगता है कि आप जिस समस्या को हल करने का प्रयास कर रहे हैं वह भी PHP से संबंधित है।

सेबेस्टियन बर्गमैन ने PHPLOC नामक एक उपकरण लिखा है जो आपको चाहिए और इसके शीर्ष पर आपको एक परियोजना की जटिलता का अवलोकन प्रदान करता है। यह इसकी रिपोर्ट का एक उदाहरण है:

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? बेहतर उपयोग GREP -C ^

wc -l? गलत! wc कमांड नए लाइनों के कोड को गिनता है, न कि लाइनों को! जब फ़ाइल की अंतिम पंक्ति नए लाइन कोड के साथ समाप्त नहीं होती है, तो इसे गिना नहीं जाएगा!

यदि आप अभी भी लाइनें गिनना चाहते हैं, तो grep -c ^ , पूर्ण उदाहरण का उपयोग करें:

#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

2
मुझे यह पता है। व्यवहार में केवल अंतिम पंक्ति अपूर्ण हो सकती है क्योंकि इसमें ईओएल नहीं मिला है। आइडिया अधूरी एक सहित सभी लाइनों की गिनती कर रहा है। यह बहुत लगातार गलती है, केवल पूर्ण लाइनों की गिनती करना। गिनने के बाद हम सोच रहे हैं कि "मैं आखिरी पंक्ति क्यों चूक गया ???"। यह उत्तर है क्यों, और इसे ठीक से करने का नुस्खा।
ज़ेनिक

या, यदि आप एक लाइनर चाहते हैं: 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
यह विफल हो जाएगा अगर किसी एक फ़ाइलनाम में कोई स्थान या एक नई रेखा है
Paweł Polewicz

4

यदि आप अपने परिणामों को लाइनों की संख्या के आधार पर क्रमबद्ध करना चाहते हैं, तो आप पहले उत्तर में ( | sortया अवरोही क्रम के लिए) जोड़ सकते हैं , जैसे:| sort -r-r

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

1
चूंकि xargs wc -lन्यूमेरिक का आउटपुट होता है, किसी को वास्तव में उपयोग करने की आवश्यकता होगी sort -nया sort -nr
डस्टिन इनग्राम

4

के लिए विंडोज , आसान और त्वरित उपकरण है LocMetrics


यदि वे bash का उपयोग कर रहे हैं, तो यह विंडोज़ पर OP की संभावना नहीं है।

1
@VanessaMcHale प्रश्न शीर्षक और विवरण दोनों को स्पष्ट रूप से यूनिक्स-केवल समाधान की आवश्यकता नहीं है। इसलिए विंडोज आधारित समाधान स्वीकार्य है। इसके अलावा जब मैं इसी तरह के समाधान की तलाश कर रहा था तो Google ने मुझे इस पृष्ठ की ओर इशारा किया।
चलता है

इस टिप्पणी से मुझे मदद मिली। मैंने यह कोशिश की और यह अच्छी तरह से काम करता है।
एलन एफ

4

कुछ अलग:

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

यह ठीक काम करता है, लेकिन आपको *.phpवर्तमान फ़ोल्डर में कम से कम एक फ़ाइल या उसके सबफ़ोल्डर्स में से एक की आवश्यकता है, या अन्य wcस्टॉल


ARG_MAX को भी ओवरफ्लो कर सकता है
मार्क के कोवान

4

यदि आप लिनक्स पर हैं (और मैं इसे आप ले रहा हूं), तो मैं अपने टूल पॉलीगोट की सलाह देता हूं । यह sloccountया तो की तुलना में नाटकीय रूप से तेज है या clocयह की तुलना में अधिक विशिष्ट है sloccount

आप इसके साथ आह्वान कर सकते हैं

poly .

या

poly

तो यह कुछ दृढ़ bash स्क्रिप्ट की तुलना में बहुत अधिक उपयोगकर्ता के अनुकूल है।


4

टूल टोकी एक निर्देशिका में कोड के बारे में आंकड़े प्रदर्शित करता है। Tokei फ़ाइलों की संख्या, उन फ़ाइलों और कोड, टिप्पणियों और भाषा द्वारा समूहीकृत ब्लैंक के भीतर कुल लाइनें दिखाएगा। Tokei मैक, लिनक्स, और विंडोज पर भी उपलब्ध है।

Tokei के उत्पादन का एक उदाहरण इस प्रकार है:

$ 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

यदि आपको अपनी पंक्तियों की कुल संख्या की आवश्यकता है तो अपनी PHP फ़ाइलों को आप विंडोज के तहत भी बहुत सरल एक लाइन कमांड का उपयोग कर सकते हैं यदि आपके पास GnuWin32 स्थापित है। ऐशे ही:

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

आपको यह निर्दिष्ट करने की आवश्यकता है कि वास्तव में find.exe कहां है अन्यथा विंडोज ने FIND.EXE प्रदान किया (पुराने डॉस-जैसे आदेशों से) निष्पादित किया जाएगा, क्योंकि यह संभवतः वातावरण PATH में GnuWin32 से पहले है, और इसके अलग-अलग पैरामीटर और परिणाम हैं।

कृपया ध्यान दें कि ऊपर दिए गए आदेश में आपको एकल उद्धरणों का नहीं बल्कि बैक-कोट्स का उपयोग करना चाहिए।


ऊपर दिए गए उदाहरण में मैं cmd.exe के बजाय विंडोज़ के लिए बैश का उपयोग कर रहा हूं, इसलिए आगे के स्लैश "/" हैं और स्लैश "\" वापस नहीं हैं।
नेवेन बोयोनोव

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")

जब तक निर्देशिका नाम या फ़ाइल नाम में से कोई भी स्थान नहीं है तब तक काम करता है। और जब तक आपके पास हजारों फाइलें नहीं हैं (आधुनिक गोले वास्तव में लंबी कमांड लाइनों का समर्थन करते हैं)। आपकी परियोजना में 74 फाइलें हैं, इसलिए आपको बढ़ने के लिए बहुत जगह मिली है।


मैं यह पसंद है! यदि आप हाइब्रिड C / C ++ वातावरण में हैं:wc -l `find . -type f \( -name "*.cpp" -o -name "*.c" -o -name "*.h" \) -print`
Bram

आश्चर्य हुआ कि यह शीर्ष उत्तर नहीं था
ms4720

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

OS X पर कम से कम, ढूँढें + xarg + wc कमांड कुछ अन्य उत्तरों में "कुल" को कई बार बड़ी सूची में सूचीबद्ध करता है, और कोई पूर्ण कुल नहीं दिया जाता है। मैं निम्न आदेश का उपयोग करके .c फ़ाइलों के लिए एक एकल प्राप्त करने में सक्षम था:

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.