बैश में, मैं एक परियोजना में कोड की गैर-रिक्त लाइनों की संख्या कैसे गिनूं?
sloc
और cloc
उन कोड लाइनों को करने के लिए यहां हैं।
बैश में, मैं एक परियोजना में कोड की गैर-रिक्त लाइनों की संख्या कैसे गिनूं?
sloc
और cloc
उन कोड लाइनों को करने के लिए यहां हैं।
जवाबों:
cat foo.c | sed '/^\s*$/d' | wc -l
और यदि आप टिप्पणियों को रिक्त रेखा मानते हैं:
cat foo.pl | sed '/^\s*#/d;/^\s*$/d' | wc -l
हालाँकि, यह भाषा पर निर्भर है।
< foo.pl sed 'stuff' | wc -l
:।
#!/bin/bash
find . -path './pma' -prune -o -path './blog' -prune -o -path './punbb' -prune -o -path './js/3rdparty' -prune -o -print | egrep '\.php|\.as|\.sql|\.css|\.js' | grep -v '\.svn' | xargs cat | sed '/^\s*$/d' | wc -l
ऊपर आपको एक परियोजना के लिए कोड की पंक्तियों की कुल संख्या (खाली लाइनों को हटा दिया जाएगा) (वर्तमान फ़ोल्डर और सभी सबफ़ोल्डर्स पुनरावर्ती)।
उपरोक्त "" ./blog "" ./punbb "" ./s/3rdparty "और" ./pma "फ़ोल्डर हैं I ब्लैकलिस्ट करें क्योंकि मैंने उनमें कोड नहीं लिखा था। इसके अलावा .php, .as, .sql, .css, .js उन फाइलों के एक्सटेंशन हैं जिन्हें देखा जा रहा है। एक अलग एक्सटेंशन वाली किसी भी फाइल को अनदेखा कर दिया जाता है।
$
grep ( ...\.js$|...
) में जोड़ना होगा अन्यथा यह मेल खाएगा feature.js.swp
।
find . | egrep '.\.c$|.\.h$' | xargs cat | sed '/^\s*$/d' | wc -l
यदि आप शेल स्क्रिप्ट के अलावा कुछ उपयोग करना चाहते हैं, तो CLOC आज़माएँ :
क्लोक कई प्रोग्रामिंग भाषाओं में रिक्त लाइनों, टिप्पणी लाइनों और स्रोत कोड की भौतिक रेखाओं को गिनता है। यह पूरी तरह से पर्ल में पूरी तरह से पर्ल वी 5.6 के मानक वितरण के बाहर निर्भरता के साथ लिखा गया है और उच्चतर (कुछ बाहरी मॉड्यूल से कोड क्लॉक के भीतर एम्बेडेड है) और इसलिए काफी पोर्टेबल है।
सामान्य शेल उपयोगिताओं का उपयोग करते हुए, ऐसा करने के कई तरीके हैं।
मेरा समाधान है:
grep -cve '^\s*$' <file>
यह <फ़ाइल> लाइनों से मेल नहीं खाता (-v) रेखाएँ जो प्रतिमान (-e) '^ \ _ * $' से मेल खाती हैं, जो एक पंक्ति की शुरुआत है, जिसके बाद 0 या अधिक व्हाट्सएप वर्ण हैं, उसके बाद एक पंक्ति के अंत तक (अर्थात। कोई सामग्री तब व्हॉट्सएप नहीं), और मिलान लाइनों के बजाय मिलान लाइनों (-c) की एक गिनती प्रदर्शित करें।
इस पद्धति का एक तरीका है जिसमें पाइपिंग को शामिल करना शामिल है wc
, यह है कि आप कई फ़ाइलों को निर्दिष्ट कर सकते हैं और प्रत्येक फ़ाइल के लिए एक अलग गणना प्राप्त कर सकते हैं:
$ grep -cve '^\s*$' *.hh
config.hh:36
exceptions.hh:48
layer.hh:52
main.hh:39
-e
इसकी आवश्यकता नही है। यह पैटर्न की सामान्य स्थिति है और आप इसके साथ कुछ भी मजेदार नहीं कर रहे हैं। लेकिन स्पष्ट होने में कुछ भी गलत नहीं है, अगर वह आपकी शैली है।
'wc' लाइनों, शब्दों, वर्णों को गिनता है, इसलिए सभी रेखाओं (रिक्त वाले सहित) का उपयोग करने के लिए गणना करें:
wc *.py
रिक्त लाइनों को फ़िल्टर करने के लिए, आप grep का उपयोग कर सकते हैं:
grep -v '^\s*$' *.py | wc
'-v' उन सभी रेखाओं को आउटपुट करने के लिए grep को बताता है, जो उस मैच को छोड़कर '^' एक लाइन की शुरुआत है '\ _ *' शून्य है या अधिक व्हाट्सएप वर्ण '$' एक पंक्ति का अंत है * .py मेरे लिए उदाहरण है। सभी फाइलें जिन्हें आप गिनना चाहते हैं (मौजूदा dir में सभी अजगर फाइलें) wc को पाइप आउटपुट। तुम जाओ।
मैं अपने स्वयं के (वास्तविक) प्रश्न का उत्तर दे रहा हूं। स्टैकओवरफ़्लो प्रविष्टि नहीं मिली जो इसे कवर करती है।
यह आदेश गैर-रिक्त लाइनों की संख्या की गणना करता है। cat fileName | grep -v ^$ | wc -l
grep -v ^ $ रेगुलर एक्सप्रेशन फंक्शन, ब्लैंक लाइन्स को अनदेखा कर रहा है।
cat
इस श्रृंखला की कोई आवश्यकता नहीं है :grep -v ^$ fileName | wl -l
wc -l
क्योंकि grep है -c
:grep -vc ^$ fileName
cat 'filename' | grep '[^ ]' | wc -l
चाल ठीक करना चाहिए
awk '/^[[:space:]]*$/ {++x} END {print x}' "$testfile"
awk '!/^[[:space:]]*$/{++x} END{print x}'
। या, यदि आप वास्तव में नकारात्मक से नफरत करते हैं awk '{y++} /^[[:space:]]*$/{++x} END{print y-x}'
;)
grep -cvE '(^\s*[/*])|(^\s*$)' foo
-c = count
-v = exclude
-E = extended regex
'(comment lines) OR (empty lines)'
where
^ = beginning of the line
\s = whitespace
* = any number of previous characters or none
[/*] = either / or *
| = OR
$ = end of the line
मैं इस कारण पोस्ट करता हूं अन्य विकल्पों ने मेरे लिए गलत उत्तर दिए हैं। यह मेरे जावा स्रोत के साथ काम करता है, जहां टिप्पणी लाइनें / या * (मैं बहु-पंक्ति टिप्पणी में प्रत्येक पंक्ति पर * का उपयोग करता है) के साथ शुरू होता है।
यहाँ एक बैश स्क्रिप्ट है जो किसी प्रोजेक्ट में कोड की पंक्तियों को गिनता है। यह एक स्रोत के पेड़ को पुनरावृत्ति करता है, और यह रिक्त पंक्तियों और एकल पंक्ति टिप्पणियों को बाहर करता है जो "//" का उपयोग करते हैं।
# $excluded is a regex for paths to exclude from line counting
excluded="spec\|node_modules\|README\|lib\|docs\|csv\|XLS\|json\|png"
countLines(){
# $total is the total lines of code counted
total=0
# -mindepth exclues the current directory (".")
for file in `find . -mindepth 1 -name "*.*" |grep -v "$excluded"`; do
# First sed: only count lines of code that are not commented with //
# Second sed: don't count blank lines
# $numLines is the lines of code
numLines=`cat $file | sed '/\/\//d' | sed '/^\s*$/d' | wc -l`
# To exclude only blank lines and count comment lines, uncomment this:
#numLines=`cat $file | sed '/^\s*$/d' | wc -l`
total=$(($total + $numLines))
echo " " $numLines $file
done
echo " " $total in total
}
echo Source code files:
countLines
echo Unit tests:
cd spec
countLines
यहाँ उत्पादन मेरी परियोजना के लिए कैसा दिखता है :
Source code files:
2 ./buildDocs.sh
24 ./countLines.sh
15 ./css/dashboard.css
53 ./data/un_population/provenance/preprocess.js
19 ./index.html
5 ./server/server.js
2 ./server/startServer.sh
24 ./SpecRunner.html
34 ./src/computeLayout.js
60 ./src/configDiff.js
18 ./src/dashboardMirror.js
37 ./src/dashboardScaffold.js
14 ./src/data.js
68 ./src/dummyVis.js
27 ./src/layout.js
28 ./src/links.js
5 ./src/main.js
52 ./src/processActions.js
86 ./src/timeline.js
73 ./src/udc.js
18 ./src/wire.js
664 in total
Unit tests:
230 ./ComputeLayoutSpec.js
134 ./ConfigDiffSpec.js
134 ./ProcessActionsSpec.js
84 ./UDCSpec.js
149 ./WireSpec.js
731 in total
का आनंद लें! - कर्रन
यह थोड़े है जो आपके पास प्रोजेक्ट में मौजूद फाइलों की संख्या पर निर्भर करता है। सिद्धांत रूप में आप उपयोग कर सकते हैं
grep -c '.' <list of files>
जहां आप फाइंड यूटिलिटी का उपयोग करके फाइलों की सूची भर सकते हैं।
grep -c '.' `find -type f`
आपको प्रति फ़ाइल एक लाइन काउंट देगा।
स्क्रिप्ट वर्तमान निर्देशिका में एक निश्चित फ़ाइल एक्सटेंशन के साथ सभी गैर-रिक्त लाइनों की पुन: गणना करने के लिए:
#!/usr/bin/env bash
(
echo 0;
for ext in "$@"; do
for i in $(find . -name "*$ext"); do
sed '/^\s*$/d' $i | wc -l ## skip blank lines
#cat $i | wc -l; ## count all lines
echo +;
done
done
echo p q;
) | dc;
नमूना उपयोग:
./countlines.sh .py .java .html
यदि आप किसी परियोजना के दौरान किसी फ़ाइल एक्सटेंशन की सभी फ़ाइलों के लिए सभी गैर-रिक्त लाइनों का योग चाहते हैं:
while read line
do grep -cve '^\s*$' "$line"
done < <(find $1 -name "*.$2" -print) | awk '{s+=$1} END {print s}'
पहला arg प्रोजेक्ट का बेस डायरेक्टरी है, दूसरा फाइल एक्सटेंशन है। नमूना उपयोग:
./scriptname ~/Dropbox/project/src java
यह पिछले समाधानों के संग्रह से थोड़ा अधिक है।
grep -v '^\W*$' `find -type f` | grep -c '.' > /path/to/lineCountFile.txt
वर्तमान निर्देशिका और इसके उपनिर्देशिकाओं में सभी फाइलों के लिए एक समग्र गणना देता है।
HTH!
${-[*]} + $@
उदाहरण के लिए, यह रेखा से मेल नहीं खाता है । जो निश्चित रूप से दुनिया में कहीं वैध कोड है। ;) आप अंतरिक्ष के लिए मतलब है।
rgrep . | wc -l
वर्तमान कार्य निर्देशिका में गैर रिक्त लाइनों की गिनती देता है।
'Wc' नामक लाइनक्स पर इसके लिए पहले से ही एक कार्यक्रम है।
केवल
wc -l *.c
और यह आपको कुल पंक्तियाँ और प्रत्येक फ़ाइल के लिए लाइनें देता है।
wc
खाली लाइनों की गिनती करता है। ओपी गैर-रिक्त लाइनों की गिनती करना चाहता है। यह सच है कि वह उपयोग करना चाहेगा wc
, लेकिन इसका उपयोग करने के बाद ही इसे संपादित किया गयाsed
foo.c
) के लिए काम करते हैं । एक परियोजना में लाइनों की टोल संख्या के बारे में कोई विचार (जैसे कि निर्देशिका संरचना में कई फाइलें, और बाइनरी फाइलें छोड़कर)?