jeśli chcę policzyć wiersze kodu, banalna rzecz
cat *.c *.h | wc -l
Ale co jeśli mam kilka podkatalogów?
recursive
source-code
Niklas
źródło
źródło
cat
?wc -l *.c *.h
robi to samo.wc -l *.c *.h | tail -n 1
uzyskać podobny wynik.**
, dzięki czemu mógłbyś użyćwc -l **/*.{h,c}
lub czegoś podobnego. Pamiętaj, że przynajmniej w Bash ta opcja (wywoływanaglobstar
) jest domyślnie wyłączona . Ale również pamiętać, że w tym konkretnym przypadku,cloc
czySLOCCount
jest dużo lepszym rozwiązaniem. (ack
Może być również lepszym rozwiązaniem dofind
łatwego znajdowania / wyświetlania plików źródłowych.)Odpowiedzi:
Najprostszym sposobem jest użycie narzędzia o nazwie
cloc
. Użyj tego w ten sposób:to jest to! :-)
źródło
Powinieneś użyć sloccount lub cloc do tego, są one zaprojektowane specjalnie do zliczania wierszy kodu źródłowego w projekcie, niezależnie od struktury katalogów itp .; zarówno
lub
wygeneruje raport na temat całego kodu źródłowego, zaczynając od bieżącego katalogu.
Jeśli chcesz użyć
find
iwc
GNUwc
ma ładny--files0-from
opcję:(Dzięki SnakeDoc za sugestią cloc !)
źródło
sloccount /tmp/stackexchange
(utworzone ponownie 17 maja po moim ostatnim ponownym uruchomieniu) mówi, że szacowany koszt opracowania znalezionych plików sh, perl, awk itp. Wynosi 11 029 USD. i nie obejmuje to jednowierszowych plików, które nigdy nie trafiły do pliku skryptu.cloc
jest również dobra: github.com/AlDanial/clocPonieważ
wc
polecenie może przyjmować wiele argumentów, możesz po prostu przekazać wszystkie nazwy plików,wc
używając+
argumentu-exec
akcji GNUfind
:Alternatywnie,
bash
za pomocą opcji powłokiglobstar
do rekursywnego przeglądania katalogów:Inne powłoki domyślnie przechodzą rekurencyjnie (np.
zsh
) Lub mają podobną opcję, jakglobstar
przynajmniej większość.źródło
Można używać
find
razem zxargs
iwc
:źródło
total
wierszy, jeśliwc
wywoływanych jest kilka s).wc
problem z kilkoma poleceniami można rozwiązać poprzez potokowaniefind
dowhile read FILENAME; do . . .done
struktury. I w użyciu pętli whilewc -l
. Reszta sumuje sumę wierszy w zmiennej i wyświetla ją.Jeśli jesteś w środowisku, w którym nie masz dostępu do
cloc
itp. SugerujęRun-through:
find
wyszukiwań rekurencyjnie dla wszystkich zwykłych plików, których nazwa kończy się na jeden.c
albo.h
i działacat
na nich. Dane wyjściowe są przesyłane potokowo,grep
aby zliczać wszystkie niepuste linie (te, które zawierają co najmniej jeden znak spacji).źródło
Jak wskazano w komentarzach, nie
cat file | wc -l
jest równoważne, ponieważ pierwszy drukuje tylko liczbę, podczas gdy drugi drukuje liczbę i nazwę pliku. Podobnie wydrukuje tylko liczbę, a jednocześnie wydrukuje wiersz informacji dla każdego pliku.wc -l file
cat * | wc -l
wc -l *
W duchu prostoty powróćmy do pytania, które faktycznie zostało zadane:
Po pierwsze, możesz uprościć nawet trywialne polecenie, aby:
I na koniec, odpowiednikiem wielu podkatalogów jest:
Być może można to poprawić na wiele sposobów, na przykład ograniczając dopasowane pliki tylko do zwykłych plików (nie katalogów) poprzez dodanie
-type f
- ale podanefind
polecenie jest dokładnym rekurencyjnym odpowiednikiemcat *.[ch]
.źródło
Próbka za pomocą
awk
:źródło
+
zamiast\;
.wc -l
dla grup plików, podobnie jakxargs
robi, ale obsługuje znaki o nieparzystej kuli (takie jak spacje) w nazwach plików, bez potrzeby używania alboxargs
(niestandardowych)-print0
i-0
opcji odpowiedniofind
ixargs
. To niewielka optymalizacja. Minusem byłoby to, że każde wywołaniewc
generowałoby całkowitą liczbę linii na końcu, gdy podano wiele plików -awk
skrypt poradziłby sobie z tym. Tak, to nie jest slam dunk-, ale bardzo często, stosując+
w miejsce\;
zfind
dobrym pomysłem.wc
. Jeśli nieznana a priori liczba plików, które zostaną znalezione , to czy istnieje ryzyko przekroczenia tego limitu, czy w jakiś sposób jest to obsługiwane przez find?find
grupuje pliki w pakiety o dogodnym rozmiarze, które nie przekroczą limitu długości listy argumentów na platformie, uwzględniając środowisko (które wynika z długości listy argumentów - więc długość listy argumentów plus wartość długość środowiska musi być mniejsza niż wartość maksymalna). IOW,find
robi to dobrze, podobnie jakxargs
robi to dobrze.łatwe polecenie:
źródło
total
wierszy, jeśliwc
wywoływanych jest kilka s).Jeśli korzystasz z Linuksa, polecam własne narzędzie, polyglot . Jest znacznie szybszy
cloc
i bardziej funkcjonalny niżsloccount
.Powinieneś także móc budować na BSD, chociaż nie ma żadnych dostarczonych plików binarnych.
Możesz to wywołać za pomocą
źródło
find . -name \*.[ch] -print | xargs -n 1 wc -l
powinien załatwić sprawę. Istnieje również kilka możliwych wariantów, takich jak użycie-exec
zamiast przesyłania do wyjściawc
.źródło
find . -name \*.[ch] -print
nie drukuje zawartości plików, tylko nazwy plików. Więc liczę liczbę plików, prawda? Czy potrzebuję `xargs '?xargs
, a także będziesz musiał obserwować wielewc
wywołań, jeśli masz dużo plików; musisz poszukać wszystkichtotal
linii i zsumować je.find . -name \*.[ch] -print0 | xargs -0 cat | wc -l
find . -name \*.[ch] -print | wc -l
) zlicza liczbę plików (chyba że nazwa pliku zawiera nowy wiersz - ale to bardzo niezwykłe) - nie zlicza liczby linii w plikach.