कोड की गिनती लाइनों?


24

अगर मैं कोड की पंक्तियों को गिनना चाहता हूं, तो तुच्छ बात है

cat *.c *.h | wc -l

लेकिन क्या होगा अगर मेरे पास कई उपनिर्देशिकाएं हैं?



3
ऑफ-टॉपिक: क्यों अनावश्यक cat? wc -l *.c *.hवही काम करता है।
थॉमस पैड्रॉन-मैकार्थी

5
@ थॉमसपैड्रॉन-मेकार्थी नहीं, यह नहीं है। आपको wc -l *.c *.h | tail -n 1समान आउटपुट प्राप्त करने की आवश्यकता होगी ।
गाइल्स एसओ- बुराई को रोकना '

2
ध्यान दें कि कुछ (संभवतः यहां तक ​​कि सबसे) आधुनिक गोले (बाश v4, Zsh, शायद अधिक) का उपयोग करके एक पुनरावर्ती-ग्लोबिंग तंत्र प्रदान करते हैं **, इसलिए आप उपयोग wc -l **/*.{h,c}या कुछ समान कर सकते थे। ध्यान दें कि बैश में, कम से कम, यह विकल्प (कहा जाता है globstar) डिफ़ॉल्ट रूप से बंद है। लेकिन यह भी ध्यान दें कि इस विशेष मामले में, clocया SLOCCountएक बेहतर विकल्प है। (इसके अलावा, स्रोत फ़ाइलों को आसानी से खोजने / सूचीबद्ध ackकरने के findलिए बेहतर हो सकता है ।)
काइल स्ट्रैंड

5
wc -l मायने रखता है लाइनें, कोड की लाइनें नहीं। 7000 रिक्त लाइनें अभी भी wc -l में दिखाई देंगी, लेकिन एक कोड मीट्रिक में नहीं गिनेगी। (टिप्पणियाँ भी आमतौर पर गिनती नहीं होती हैं)
coteyr

जवाबों:


49

सबसे आसान तरीका है नामक उपकरण का उपयोग करना cloc। इसे इस तरह से उपयोग करें:

cloc .

बस। :-)


1
-1 क्योंकि इस कार्यक्रम में अपने छोटे, उबाऊ मस्तिष्क के बाहर की भाषाओं में कोड की पंक्तियों को पहचानने का कोई तरीका नहीं है। यह Ada और Pascal और C और C ++ और Java और "एंटरप्राइज़" प्रकार की भाषाओं के बारे में जानता है, लेकिन यह SLOC को केवल फ़ाइल एक्सटेंशन द्वारा गिनने से इंकार करता है, और इस प्रकार यह DSL के लिए पूरी तरह से बेकार है, या यहां तक ​​कि भाषाओं के लिए भी ऐसा नहीं होता है। के बारे में।
बिल्ली

21
@cat कुछ भी सही नहीं है, और कुछ भी आपके अतीत और भविष्य की सभी मांगों को पूरा नहीं कर सकता है।
1

2
खैर, प्रोग्रामिंग भाषा जिसे CLOC मानने से इंकार करती है, वह वास्तव में मेरे अतीत और भविष्य की सभी मांगों को पूरा करती है :)
बिल्ली

6
@ CLOC प्रलेखन के अनुसार यह एक भाषा परिभाषा फ़ाइल में पढ़ सकता है, इसलिए इसे भाषा में कोड पहचानने के लिए इसे प्राप्त करने का एक तरीका है जो इसे परिभाषित नहीं करता है। इसके अलावा यह खुला स्रोत है, इसलिए आप इसे बेहतर बनाने के लिए इसे हमेशा बढ़ा सकते हैं!
सेंचुरी

39

आप शायद का उपयोग करना चाहिए SLOCCount या cloc इस के लिए, वे एक परियोजना में स्रोत कोड की लाइनों की गिनती के लिए विशेष रूप से डिजाइन कर रहे हैं निर्देशिका संरचना की परवाह किए बिना आदि .; भी

sloccount .

या

cloc .

वर्तमान स्रोत से शुरू होने वाले सभी स्रोत कोड पर एक रिपोर्ट का उत्पादन करेगा।

यदि आप उपयोग करना चाहते हैं findऔर wc, GNU के wcपास एक अच्छा --files0-fromविकल्प है:

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

( क्लॉक सुझाव के लिए स्नेकडॉक के लिए धन्यवाद !)


ढलान के लिए +1। दिलचस्प है, चल रहा है sloccount /tmp/stackexchange(मेरे सबसे हालिया रिबूट के बाद 17 मई को फिर से बनाया गया) का कहना है कि श, पर्ल, awk, आदि फ़ाइलों को विकसित करने की अनुमानित लागत $ 11,029 है। और इसमें एक-लाइनर शामिल नहीं है जो इसे स्क्रिप्ट फ़ाइल में कभी नहीं बनाता है।
कैस

11
कोड की लाइनों के आधार पर अनुमानित लागत? स्पेगेटी को री-फैक्टर में नियोजित सभी लोगों के बारे में क्या कहा जा सकता है?
मोनिका

@ ऑरेंजडॉग आप हमेशा ओवरहेड में उसके लिए खाते की कोशिश कर सकते हैं; गणना की व्याख्या के लिए दस्तावेज़ीकरण देखें (बहुत पुराने वेतन डेटा के साथ) और पैरामीटर आप ट्विक कर सकते हैं।
स्टीफन किट

5
clocसाथ ही अच्छा है: github.com/AlDanial/cloc
स्नेपडॉक

@StephenKitt> अभी भी, मुख्य मुद्दा यह है कि यह पीछे की ओर गिन रहा है। कोड को साफ करते समय, आप अक्सर कम लाइनों के साथ समाप्त होते हैं। सुनिश्चित करें कि आप ओवरहेड को हटाने के लिए कोड के बाकी हिस्सों पर हाथ लगाने की कोशिश कर सकते हैं, लेकिन मैं यह नहीं देखता कि पहली जगह में पूरी कीमत का अनुमान लगाने से बेहतर कैसे है।
स्पेक्ट्रा्स

10

चूंकि wcकमांड कई तर्क दे सकती है, आप GNU की कार्रवाई के तर्क का wcउपयोग करने के लिए सभी फाइलनाम पास कर सकते हैं :+-execfind

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

वैकल्पिक रूप से, में bash, globstarनिर्देशिकाओं को पुनरावृत्ति करने के लिए शेल विकल्प का उपयोग करते हुए :

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

अन्य गोले डिफ़ॉल्ट रूप से (उदाहरण के लिए zsh) पुनरावृत्ति करते हैं या उनके समान विकल्प होते हैं globstar, जैसे , कम से कम अधिकांश।


1
एक मशीन पर गैर-मानक सॉफ़्टवेयर स्थापित करने की आवश्यकता नहीं है, जहां मेरे पास रूट नहीं है
Bamboomy

5

आप findएक साथ xargsऔर उपयोग कर सकते हैं wc:

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

2
(यह मानते हुए कि फ़ाइल पथ में रिक्तियाँ, newlines, एकल उद्धरण, बैकस्लैश वर्णों की दोहरी बोली शामिल नहीं है। यह कई totalपंक्तियों को भी आउटपुट कर सकता है यदि कई wcएस को आमंत्रित किया जा रहा है।)
स्टीफन चेज़लस

शायद संरचना को wcपाइपिंग द्वारा कई कमांड समस्या को संबोधित किया जा सकता है । और अंदर लूप का उपयोग करते समय । शेष कुल लाइनों को एक चर में समेट कर प्रदर्शित करता है। findwhile read FILENAME; do . . .donewc -l
सर्गी कोलोडियाज़नी

5

यदि आप एक ऐसे वातावरण में हैं जहाँ आपके पास पहुंच नहीं है तो clocमैं सुझाव दूंगा

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

रन-थ्रू: findउन सभी नियमित फ़ाइलों के लिए पुनरावर्ती खोज करता है जिनका नाम .cया तो समाप्त होता है या उन पर .hचलता catहै। आउटपुट को grepसभी गैर-रिक्त लाइनों (वे जिनमें कम से कम एक गैर-रिक्ति वर्ण होते हैं) को गिनने के लिए पाइप किया गया है।


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 }'

के +स्थान पर उपयोग करें \;
जोनाथन लेफ़लर

@JonathanLeffler क्यों?
हस्त्तूर

1
@Hastur: यह चलाता wc -lफ़ाइलों के समूहों के लिए, बल्कि तरह xargsकरता है, लेकिन यह या तो जरूरत के बिना फ़ाइल नामों में (रिक्त स्थानों की तरह) अजीब गेंद पात्रों संभालती है xargsया (गैर मानक) -print0और -0करने के लिए विकल्पों findऔर xargsक्रमशः। यह एक मामूली अनुकूलन है। नकारात्मक पक्ष यह होगा कि प्रत्येक wcफाइल के अंत में कुल लाइन काउंट को कई फाइलों को दिए जाने पर - awkस्क्रिप्ट के साथ सौदा होगा। इसलिए, यह एक स्लैम-डंक नहीं है, लेकिन बहुत बार, का उपयोग कर +के स्थान पर \;साथ findएक अच्छा विचार है।
जोनाथन लेफ़लर

@JonathanLeffler धन्यवाद। मैं सहमत हूँ। हालाँकि, मेरी चिंताएँ पैरामीटर स्ट्रिंग की लंबाई को लेकर थीं wc। तो अज्ञात एक प्रायोरी कि हो जाएगा फ़ाइलों की संख्या पाया , वहाँ जोखिम है कि सीमा पारित करने के लिए है या किसी भी तरह इसे खोजने के द्वारा नियंत्रित किया जाता?
हस्त्तूर

2
@ हस्तूर: findफाइलों को सुविधाजनक आकार के बंडलों में समूहित करता है, जो प्लेटफॉर्म पर तर्क सूची की लंबाई सीमा से अधिक नहीं होगा, पर्यावरण के लिए अनुमति देता है (जो तर्क सूची की लंबाई से बाहर आता है - इसलिए तर्क सूची की लंबाई प्लस पर्यावरण की लंबाई अधिकतम मूल्य से कम होनी चाहिए)। IOW, findकाम को सही xargsकरता है , जैसे काम को सही करता है।
जोनाथन लेफ़लर

1

आसान आदेश:

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

(यह मानते हुए कि फ़ाइल पथ में रिक्तियाँ, newlines, एकल उद्धरण, बैकस्लैश वर्णों की दोहरी बोली शामिल नहीं है। यह कई totalपंक्तियों को भी आउटपुट कर सकता है यदि कई wcएस को आमंत्रित किया जा रहा है।)
स्टीफन चेज़लस

0

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

आपको बीएसडी पर भी निर्माण करने में सक्षम होना चाहिए, हालांकि कोई भी बायनेरिज़ नहीं हैं।

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

poly .

-2

find . -name \*.[ch] -print | xargs -n 1 wc -lचाल चलनी चाहिए। उस पर कई संभावित भिन्नताएं हैं, जैसे -execकि आउटपुट को पाइप करने के बजाय उपयोग करना wc


4
लेकिन find . -name \*.[ch] -printफ़ाइलों की सामग्री को मुद्रित नहीं करता है, केवल फ़ाइल नाम। इसलिए मैं इसके बजाय फाइलों की संख्या की गणना करता हूं? क्या मुझे `xargs’ की आवश्यकता है?
निकोलस

@ Programmer400 हाँ, आपको आवश्यकता होगी xargs, और wcयदि आपके पास बहुत सारी फाइलें हैं, तो आपको कई इनवोकेशन देखने की भी आवश्यकता होगी ; आपको सभी totalलाइनों को देखने और उन्हें योग करने की आवश्यकता होगी।
स्टीफन किट

तुम सिर्फ कुल लाइन गिनती चाहते हैं, आप सब करने की ज़रूरत होगीfind . -name \*.[ch] -print0 | xargs -0 cat | wc -l
शराबी

ध्यान दें कि यह ( find . -name \*.[ch] -print | wc -l) फ़ाइलों की संख्या को गिनता है (जब तक कि एक फ़ाइल नाम में एक नई पंक्ति नहीं होती है - लेकिन यह बहुत ही असामान्य है) - यह फाइलों में लाइनों की संख्या की गणना नहीं करता है।
जोनाथन लेफ़लर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.