Jak w Bash policzyć liczbę niepustych wierszy kodu w projekcie?
sloc
i, cloc
które służą do liczenia tych linii kodu.
Jak w Bash policzyć liczbę niepustych wierszy kodu w projekcie?
sloc
i, cloc
które służą do liczenia tych linii kodu.
Odpowiedzi:
cat foo.c | sed '/^\s*$/d' | wc -l
A jeśli weźmiesz pod uwagę puste linie komentarzy:
cat foo.pl | sed '/^\s*#/d;/^\s*$/d' | wc -l
Chociaż jest to zależne od języka.
< 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
Powyższe daje całkowitą liczbę wierszy kodu (puste wiersze usunięte) dla projektu (bieżący folder i wszystkie podfoldery rekurencyjnie).
W powyższych "./blog" "./punbb" "./js/3rdparty" i "./pma" znajdują się foldery, które umieściłem na czarnej liście, ponieważ nie napisałem w nich kodu. Również .php, .as, .sql, .css, .js są rozszerzeniami przeglądanych plików. Wszystkie pliki z innym rozszerzeniem są ignorowane.
$
do grep ( ...\.js$|...
), w przeciwnym razie będzie pasować feature.js.swp
.
find . | egrep '.\.c$|.\.h$' | xargs cat | sed '/^\s*$/d' | wc -l
Jeśli chcesz użyć czegoś innego niż skrypt powłoki, wypróbuj CLOC :
cloc liczy puste wiersze, wiersze komentarzy i fizyczne wiersze kodu źródłowego w wielu językach programowania. Został napisany w całości w Perlu bez żadnych zależności poza standardową dystrybucją Perla w wersji 5.6 i nowszej (kod z niektórych zewnętrznych modułów jest osadzony w cloc), a więc jest dość przenośny.
Można to zrobić na wiele sposobów, używając typowych narzędzi powłoki.
Moje rozwiązanie to:
grep -cve '^\s*$' <file>
Wyszukuje wiersze w <file> wiersze niedopasowania (-v) pasujące do wzorca (-e) '^ \ s * $', który jest początkiem wiersza, po którym następuje 0 lub więcej białych znaków, po których na końcu wiersza (tj. bez zawartości innej niż białe znaki) i wyświetla liczbę pasujących wierszy (-c) zamiast samych pasujących wierszy.
Zaletą tej metody w porównaniu z metodami wymagającymi potoku wc
jest to, że możesz określić wiele plików i uzyskać oddzielną liczbę dla każdego pliku:
$ grep -cve '^\s*$' *.hh
config.hh:36
exceptions.hh:48
layer.hh:52
main.hh:39
-e
to nie jest konieczne. To normalne położenie wzorca i nie robisz z nim nic dziwnego. Ale nie ma nic złego w wyrażaniu się wprost, jeśli taki jest twój styl.
'wc' liczy linie, słowa, znaki, więc aby policzyć wszystkie linie (w tym puste) użyj:
wc *.py
Aby odfiltrować puste wiersze, możesz użyć grep:
grep -v '^\s*$' *.py | wc
`-v 'mówi grepowi, że ma wypisać wszystkie wiersze z wyjątkiem tych, które pasują do' ^ 'to początek linii' \ s * 'to zero lub więcej białych znaków' $ 'to koniec linii * .py to mój przykład dla wszystkie pliki, które chcesz policzyć (wszystkie pliki Pythona w bieżącym katalogu) potokują wyjście do wc. Dalej.
Odpowiadam na swoje (prawdziwe) pytanie. Nie udało się znaleźć wpisu przepełnienia stosu, który to obejmował.
To polecenie liczy liczbę niepustych wierszy. cat fileName | grep -v ^$ | wc -l
grep -v ^ $ funkcja wyrażenia regularnego ignoruje puste wiersze.
cat
tym łańcuchu nie ma potrzeby :grep -v ^$ fileName | wl -l
wc -l
ponieważ grep ma -c
:grep -vc ^$ fileName
cat 'filename' | grep '[^ ]' | wc -l
powinien załatwić sprawę dobrze
awk '/^[[:space:]]*$/ {++x} END {print x}' "$testfile"
awk '!/^[[:space:]]*$/{++x} END{print x}'
. Lub, jeśli naprawdę nienawidzisz negatywów 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
Publikuję to, ponieważ inne opcje dały mi złe odpowiedzi. To działało z moim źródłem java, gdzie linie komentarzy zaczynają się od / lub * (używam * w każdym wierszu w komentarzu wielowierszowym).
Oto skrypt Bash, który zlicza wiersze kodu w projekcie. Przechodzi rekurencyjnie przez drzewo źródłowe i wyklucza puste wiersze i pojedyncze komentarze, które używają „//”.
# $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
Oto, jak wygląda wynik dla mojego projektu :
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
Cieszyć się! - Curran
To będzie zależało od liczby plików, które masz w projekcie. Teoretycznie możesz użyć
grep -c '.' <list of files>
Gdzie możesz wypełnić listę plików za pomocą narzędzia wyszukiwania.
grep -c '.' `find -type f`
Dałoby ci liczbę wierszy na plik.
Skrypt do rekurencyjnego zliczania wszystkich niepustych wierszy z określonym rozszerzeniem pliku w bieżącym katalogu:
#!/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;
Przykładowe użycie:
./countlines.sh .py .java .html
Jeśli chcesz uzyskać sumę wszystkich niepustych wierszy dla wszystkich plików o danym rozszerzeniu w całym projekcie:
while read line
do grep -cve '^\s*$' "$line"
done < <(find $1 -name "*.$2" -print) | awk '{s+=$1} END {print s}'
Pierwszy argument to katalog podstawowy projektu, drugi to rozszerzenie pliku. Przykładowe użycie:
./scriptname ~/Dropbox/project/src java
To niewiele więcej niż zbiór wcześniejszych rozwiązań.
grep -v '^\W*$' `find -type f` | grep -c '.' > /path/to/lineCountFile.txt
podaje łączną liczbę wszystkich plików w bieżącym katalogu i jego podkatalogach.
HTH!
${-[*]} + $@
na przykład do linii . Który z pewnością jest prawidłowym kodem gdzieś na świecie. ;) Masz na myśli przestrzeń.
rgrep . | wc -l
podaje liczbę niepustych wierszy w bieżącym katalogu roboczym.
W Linuksie jest już program o nazwie „wc”.
Właśnie
wc -l *.c
i daje całkowitą liczbę wierszy i wierszy dla każdego pliku.
wc
liczy puste wiersze. Operator operacyjny chce liczyć niepuste wiersze. To prawda, że będzie chciał użyć wc
, ale dopiero po tym, jak został on sed
foo.c
.). Jakieś przemyślenia na temat całkowitej liczby wierszy w projekcie (np. Wiele plików w strukturze katalogów, z wyłączeniem plików binarnych)?