Jak w Bash policzyć liczbę niepustych wierszy kodu w projekcie?
sloci, clocktóre służą do liczenia tych linii kodu.
Jak w Bash policzyć liczbę niepustych wierszy kodu w projekcie?
sloci, clocktó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 wcjest 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
-eto 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.
cattym łańcuchu nie ma potrzeby :grep -v ^$ fileName | wl -l
wc -lponieważ 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.
wcliczy 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)?