Wiele z poniższych rozwiązań działa tylko dla jednego pliku (np 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)?
rozwiązywanie łamigłówek
5
@solvingPuzzles Myślę, że mogę odpowiedzieć na tę część. W przypadku każdego rozwiązania, które działa na jednym pliku, np. „Cat FILE | sed blah”, można pracować na wielu plikach, zastępując „cat FILE” poleceniem, które zawiera listę nazw plików do wykonania, np. „Find. -Name” * .py '"i potokuj to do" xargs cat ". np. "find. -name '* .py' | xargs cat | sed '/ ^ \ s * $ / d' | wc -l"
Jonathan Hartley
2
@JonathanHartley @solvingPuzzles są też programy takie jak sloci, clocktóre służą do liczenia tych linii kodu.
AsTeR
OP tutaj: Kiedy po raz pierwszy zadałem ten problem, 'cloc' nie wykonał zbyt dobrej pracy w kodzie Pythona. Obecnie jest świetnie.
Jonathan Hartley
cloc jest również dostępny jako moduł npm i oszczędza dużo czasu.
Krishna Vedula
Odpowiedzi:
193
cat foo.c | sed '/^\s*$/d'| wc -l
A jeśli weźmiesz pod uwagę puste linie komentarzy:
Nie jestem pewien, dlaczego używasz tam kota. Użyj foo.c lub foo.pl jako nazwy pliku, aby przekazać do seda. sed '/ ^ \ s * $ / d' foo.c | wc -l
Andy Lester
28
Po prostu nawyk. Potoki czytam od lewej do prawej, co oznacza, że zwykle zaczynam od cat, potem akcja, akcja, akcja itd. Oczywiście, efekt końcowy jest taki sam.
Michael Cramer,
32
Aby to zrobić dla wszystkich plików we wszystkich podfolderach i wykluczyć komentarze z '//', rozszerz to polecenie do tego: find. -type f -name '* .c' -exec cat {} \; | sed '/ ^ \ s * # / d; / ^ \ s * $ / d; / ^ \ s * \ / \ // d' | wc -l
Benjamin Intal
11
Możesz czytać od lewej do prawej bez UUOC: < foo.pl sed 'stuff' | wc -l.
jw013
22
Ogólnie rzecz biorąc, UUOC nie jest ważny, ale czytelność jest.
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.
Musisz dodać a $do grep ( ...\.js$|...), w przeciwnym razie będzie pasować feature.js.swp.
Xeoncross
Zapomniałeś o zakotwiczeniu, więc zawiera niewłaściwe pliki. I jeszcze prostsza wersja z zakotwiczeniem:find . | egrep '.\.c$|.\.h$' | xargs cat | sed '/^\s*$/d' | wc -l
Mark Jeronimus
36
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.
Kiedy po raz pierwszy zadałem to pytanie, „cloc” liczył dokumenty Pythona jako wiersze kodu, co było nieoptymalnym IMHO. Współczesne wersje „cloc” liczą teraz ciągi dokumentacyjne Pythona jako komentarze, które lubię o wiele bardziej.
Jonathan Hartley
To jest poprawna odpowiedź! Właśnie wypróbowałem cloc i to działa dobrze.
LeeMobile
31
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:
Dzięki! Nawiasem mówiąc, wc podaje liczbę dla każdego podanego pliku plus sumę.
Jonathan Hartley
1
Jednak nie, jeśli przepuszczasz do niego potok, ponieważ standardowo liczy się jako jeden plik.
SpoonMeiser
Moim zdaniem to najlepsza odpowiedź.
simhumileco
-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.
Jacktose
13
'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ł.
\ W nie pasuje do białych znaków, dopasowuje znaki niebędące słowami. To przeciwieństwo \ w, znaków słownych. \ W Będzie pasować do wszystkiego, co nie jest alfanumeryczne ani podkreślone, a zatem nie będzie robić tego, co twierdzisz, że robi tutaj. Masz na myśli \ s
SpoonMeiser,
9
To polecenie liczy liczbę niepustych wierszy. cat fileName | grep -v ^$ | wc -l grep -v ^ $ funkcja wyrażenia regularnego ignoruje puste wiersze.
Zagłosowałbym za tym tylko dlatego, że dosłownie nigdy nie widziałem nikogo, kto używa preinkrementacji w skrypcie awk, ale niestety liczy to tylko puste wiersze. :) Masz na myśli awk '!/^[[:space:]]*$/{++x} END{print x}'. Lub, jeśli naprawdę nienawidzisz negatywów awk '{y++} /^[[:space:]]*$/{++x} END{print y-x}',;)
dannysauer
4
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).
To wykonalne rozwiązanie. Jedyna rzecz, na którą należy zwrócić uwagę: nie obejmuje komentarzy wieloliniowych
Amol,
2
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
. dopasowuje spacje. To rozwiązanie działa tylko wtedy, gdy uważasz, że linia zawierająca tylko białe znaki nie jest pusta, co technicznie jest takie, chociaż prawdopodobnie nie jest tym, czego szukasz.
SpoonMeiser
1
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"$@";dofor i in $(find .-name "*$ext");do
sed '/^\s*$/d' $i | wc -l ## skip blank lines#cat $i | wc -l; ## count all lines
echo +;donedone
echo p q;)| dc;
\ W to znaki niebędące słowami; nie będzie to pasowało ${-[*]} + $@na przykład do linii . Który z pewnością jest prawidłowym kodem gdzieś na świecie. ;) Masz na myśli przestrzeń.
dannysauer
0
To daje liczbę wierszy bez liczenia pustych wierszy:
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)?sloc
i,cloc
które służą do liczenia tych linii kodu.Odpowiedzi:
A jeśli weźmiesz pod uwagę puste linie komentarzy:
Chociaż jest to zależne od języka.
źródło
< foo.pl sed 'stuff' | 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.
źródło
$
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 :
źródło
Można to zrobić na wiele sposobów, używając typowych narzędzi powłoki.
Moje rozwiązanie to:
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:źródło
-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:
Aby odfiltrować puste wiersze, możesz użyć grep:
`-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ł.
źródło
To polecenie liczy liczbę niepustych wierszy.
cat fileName | grep -v ^$ | wc -l
grep -v ^ $ funkcja wyrażenia regularnego ignoruje puste wiersze.
źródło
cat
tym łańcuchu nie ma potrzeby :grep -v ^$ fileName | wl -l
wc -l
ponieważ grep ma-c
:grep -vc ^$ fileName
źródło
powinien załatwić sprawę dobrze
źródło
źródło
awk '!/^[[:space:]]*$/{++x} END{print x}'
. Lub, jeśli naprawdę nienawidzisz negatywówawk '{y++} /^[[:space:]]*$/{++x} END{print y-x}'
,;)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).
źródło
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ą „//”.
Oto, jak wygląda wynik dla mojego projektu :
Cieszyć się! - Curran
źródło
To będzie zależało od liczby plików, które masz w projekcie. Teoretycznie możesz użyć
Gdzie możesz wypełnić listę plików za pomocą narzędzia wyszukiwania.
Dałoby ci liczbę wierszy na plik.
źródło
Skrypt do rekurencyjnego zliczania wszystkich niepustych wierszy z określonym rozszerzeniem pliku w bieżącym katalogu:
Przykładowe użycie:
źródło
Jeśli chcesz uzyskać sumę wszystkich niepustych wierszy dla wszystkich plików o danym rozszerzeniu w całym projekcie:
Pierwszy argument to katalog podstawowy projektu, drugi to rozszerzenie pliku. Przykładowe użycie:
To niewiele więcej niż zbiór wcześniejszych rozwiązań.
źródło
podaje łączną liczbę wszystkich plików w bieżącym katalogu i jego podkatalogach.
HTH!
źródło
${-[*]} + $@
na przykład do linii . Który z pewnością jest prawidłowym kodem gdzieś na świecie. ;) Masz na myśli przestrzeń.To daje liczbę wierszy bez liczenia pustych wierszy:
źródło
podaje liczbę niepustych wierszy w bieżącym katalogu roboczym.
źródło
W Linuksie jest już program o nazwie „wc”.
Właśnie
i daje całkowitą liczbę wierszy i wierszy dla każdego pliku.
źródło
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ł onsed