Mamy aplikację PHP i chcemy policzyć wszystkie wiersze kodu w określonym katalogu i jego podkatalogach. Nie musimy ignorować komentarzy, ponieważ staramy się tylko uzyskać ogólny pomysł.
wc -l *.php
To polecenie działa świetnie w danym katalogu, ale ignoruje podkatalogi. Myślałem, że to może zadziałać, ale zwraca 74, co zdecydowanie nie jest przypadkiem ...
find . -name '*.php' | wc -l
Jaka jest poprawna składnia dla wszystkich plików?
find . -name '*.php' -o -name '*.inc' | xargs wc -l
wc
będzie uruchamiany wiele razy. Nie obsługuje także wielu specjalnych nazw plików.find . -name "*.php" -not -path "./tests*" | xargs wc -l
W przypadku kolejnej linijki:
działa na nazwach ze spacjami, wyświetla tylko jedną liczbę.
źródło
man find
.. print0 z xargs -0 pozwala operować na plikach, które mają spacje lub inne dziwne znaki w swojej nazwie( find . \( -name '*.h' -o -name '*.cpp' \) -print0 | xargs -0 cat ) | wc -l
Jeśli używasz całkiem nowej wersji Bash (lub ZSH), jest to o wiele prostsze:
W powłoce Bash wymaga to ustawienia
globstar
opcji, w przeciwnym razie**
operator globalny nie będzie rekurencyjny. Aby włączyć to ustawienie, problemAby uczynić to na stałe, dodać go do jednego z plików inicjalizacji (
~/.bashrc
,~/.bash_profile
etc.).źródło
globstar
Aby to działało, należy ustawić Bash .wc -l **/*.[ch]
znajduje w sumie 15195373 wierszy. Nie jestem pewien, czy uważasz to za „bardzo niską wartość”. Ponownie musisz upewnić się, że maszglobstar
włączony Bash. Możesz to sprawdzić za pomocąshopt globstar
. Aby to wyraźnie włączyć, wykonajshopt -s globstar
.ARG_MAX
jeśli masz dużą liczbę.php
plików, ponieważwc
nie jest wbudowane.find
zawierają spacje. Można to naprawić za pomocąprint0
i--null
przy pomocy wywołańfind
ixargs
.Możesz użyć
cloc
narzędzia zbudowanego właśnie w tym celu. Podaje liczbę wierszy w każdym języku, a także liczbę komentarzy itp. CLOC jest dostępny w systemach Linux, Mac i Windows.Przykład użycia i wyjścia:
źródło
cloc
jest to platforma wieloplatformowa, ponieważ jest to tylko skrypt Perla?W systemach typu UNIX istnieje narzędzie o nazwie,
cloc
które zapewnia statystyki kodu.Natknąłem się na losowy katalog w naszej bazie kodu:
źródło
choco install cloc
Nie określono liczby plików ani żądanego wyniku. Czy tego szukasz:
źródło
go () { mkdir /tmp/go; [[ -f ./"$1" ]] && mv ./"$1" /tmp/go; (find ./ -type f -name "$*" -print0 | xargs -0 cat ) | wc -l; wc -l /tmp/go/*; mv /tmp/go/* . }
Wyniki były zbliżone do slocount za*.py
, ale nie wiem*.js
,*.html
.Kolejna odmiana :)
Edycja: da całkowitą sumę zamiast pliku po pliku.
Edycja2: Dodaj
.
po,find
aby to działałoźródło
$ find -name \*\.php -print0 | xargs -0 cat | wc -l
find . -name '*.php' | xargs cat | wc -l
... podczas gdy daje to plik po pliku i wielką sumę:find . -name '*.php' | xargs wc -l
Zaskakujące, że nie ma odpowiedzi w oparciu o find
-exec
iawk
. No to ruszamy:Ten fragment znajduje się dla wszystkich plików (
-type f
). Aby znaleźć według rozszerzenia pliku, użyj-name
:źródło
find . -name '*.c' -print0 |xargs -0 wc -l
. To powiedziawszy, ta szybsza metoda (przynajmniej w OS X) powoduje kilkakrotne wydrukowanie „sumy”, więc wymagane jest dodatkowe filtrowanie, aby uzyskać odpowiednią sumę (opublikowałem szczegóły w mojej odpowiedzi).wc
w formie acat
jest powolne, ponieważ system musi najpierw przetworzyć wszystkie GB, aby rozpocząć zliczanie wierszy (testowany z 200 GB plików jsons, 12k plików). zrobieniewc
najpierw, a następnie policzenie wyniku jest znacznie szybszefind . -type f -exec wc -l {} \+
lubfind . -name '*.py' -type f -exec wc -l {} \+
który wypisuje sumę na końcu wyniku. Jeśli interesuje Cię tylko suma, możesz pójść o krok dalej i użyćtail
:find . -type f -exec wc -l {} \+ | tail -1
lubfind . -name '*.py' -type f -exec wc -l {} \+ | tail -1
Bardziej powszechne i proste jak dla mnie, załóżmy, że musisz liczyć pliki o różnych rozszerzeniach nazw (np. Także tubylcy)
Dziękuję za informację zwrotną, poprawiłem ją.
źródło
$()
POSIX
W przeciwieństwie do większości innych odpowiedzi tutaj, działają one w dowolnym systemie POSIX, dla dowolnej liczby plików i z dowolnymi nazwami plików (z wyjątkiem przypadków, gdy zaznaczono inaczej).
Linie w każdym pliku:
Linie w każdym pliku, posortowane według ścieżki pliku
Linie w każdym pliku, posortowane według liczby linii, maleją
Łączna liczba wierszy we wszystkich plikach
źródło
Istnieje małe narzędzie o nazwie sloccount do zliczania linii kodu w katalogu. Należy zauważyć, że robi więcej, niż chcesz, ponieważ ignoruje puste linie / komentarze, grupuje wyniki według języka programowania i oblicza niektóre statystyki.
źródło
To, czego chcesz, to prosta
for
pętla:źródło
xargs
?IFS=$'\n'
przed pętlą przynajmniej poprawiłoby to dla wszystkich oprócz plików z nazwami nowej linii. Po drugie, nie cytujesz'*.php'
, więc zostanie on rozszerzony przez powłokę, a niefind
, a ergo nie znajdzie żadnego pliku php w podkatalogach. Również-print
jest zbędne, ponieważ sugeruje się brak innych działań.tylko dla źródeł:
do filtrowania użyj po prostu grep
źródło
Prosty, który będzie szybki, wykorzysta całą moc wyszukiwania / filtrowania
find
, nie zawiedzie, gdy jest zbyt wiele plików (przepełnienie argumentów liczbowych), działa dobrze z plikami ze śmiesznymi symbolami w nazwie, bez użyciaxargs
, nie uruchomi niepotrzebnie duża liczba poleceń zewnętrznych (z uwagi+
nafind
„e-exec
). Proszę bardzo:źródło
\;
zamiast tego,+
że nie byłem tego świadomy), ta odpowiedź powinna być poprawna.Wiem, że pytanie jest oznaczone jako grzmotnąć, ale wydaje się, że problem, który próbujesz rozwiązać, jest również związany z PHP.
Sebastian Bergmann napisał narzędzie o nazwie PHPLOC, które robi to, co chcesz, a na dodatek zapewnia przegląd złożoności projektu. Oto przykład jego raportu:
Jak widać, dostarczone informacje są o wiele bardziej przydatne z perspektywy dewelopera, ponieważ mogą z grubsza powiedzieć, jak skomplikowany jest projekt, zanim zaczniesz z nim pracować.
źródło
Zgaduję, że nikt nigdy nie zobaczy tego zakopanego z tyłu ... Jednak żadna z dotychczasowych odpowiedzi nie dotyczy problemu nazw plików ze spacjami. Ponadto wszystkie te zastosowania
xargs
mogą ulec awarii, jeśli całkowita długość ścieżek w drzewie przekroczy limit wielkości środowiska powłoki (domyślnie w Linuksie jest to kilka megabajtów). Oto jeden, który naprawia te problemy w dość bezpośredni sposób. Podpowłoka zajmuje się plikami ze spacjami.awk
Wynosi strumień poszczególnych plikówwc
wyjść, więc nigdy nie powinno zabraknąć miejsca. Ogranicza równieżexec
tylko do plików (pomijanie katalogów):źródło
wc -l? Źle! polecenie wc zlicza nowe kody wierszy, a nie wiersze! Kiedy ostatni wiersz w pliku nie kończy się nowym kodem wiersza, nie zostanie to policzone!
jeśli nadal chcesz zliczać linie, użyj grep -c ^ , pełny przykład:
na koniec uważaj na pułapkę wc -l (liczy się wejścia, a nie wiersze !!!)
źródło
grep -c ^
liczysz liczbę niekompletnych linii , a takie niekompletne linie nie mogą pojawić się w pliku tekstowym .find -type f -name '*.php' -print0 | xargs -0 grep -ch ^ | paste -sd+ - | bc
bc
Zsh globs jest bardzo łatwe:
Jeśli używasz bash, wystarczy uaktualnić. Nie ma absolutnie żadnego powodu, aby używać bash.
źródło
bardzo prosto
źródło
Jeśli chcesz posortować wyniki według liczby wierszy, możesz po prostu dodać
| sort
lub| sort -r
(-r
w kolejności malejącej) do pierwszej odpowiedzi, w ten sposób:źródło
xargs wc -l
są liczbowe, należałoby użyćsort -n
lubsort -nr
.W systemie Windows łatwym i szybkim narzędziem jest LocMetrics .
źródło
Coś innego:
Działa to dobrze, ale musisz mieć co najmniej jeden
*.php
plik w bieżącym folderze lub jednym z jego podfolderów, w przeciwnym raziewc
przeciągnie sięźródło
Jeśli korzystasz z Linuksa (i rozumiem, że tak), polecam moje narzędzie polyglot . Jest to znacznie szybciej niż którykolwiek
sloccount
albocloc
i to jest potężniejszy niżsloccount
.Możesz to wywołać za pomocą
lub
więc jest o wiele bardziej przyjazny dla użytkownika niż jakiś zawiły skrypt bash.
źródło
Narzędzie Tokei wyświetla statystyki dotyczące kodu w katalogu. Tokei pokaże liczbę plików, całkowitą liczbę wierszy w tych plikach i kod, komentarze i spacje pogrupowane według języka. Tokei jest również dostępny na komputery Mac, Linux i Windows.
Przykład danych wyjściowych Tokei jest następujący:
Tokei można zainstalować, postępując zgodnie z instrukcjami w pliku README w repozytorium .
źródło
Jeśli potrzebujesz tylko całkowitej liczby wierszy, powiedzmy, że w twoich plikach PHP możesz użyć bardzo prostego polecenia w jednym wierszu, nawet pod Windows, jeśli masz zainstalowany GnuWin32. Lubię to:
Musisz określić, gdzie dokładnie jest find.exe, w przeciwnym razie zostanie uruchomiony FIND.EXE dostarczony przez system Windows (ze starych poleceń podobnych do DOS), ponieważ prawdopodobnie znajduje się on przed GnuWin32 w ścieżce środowiska i ma inne parametry i wyniki.
Pamiętaj, że w powyższym poleceniu powinieneś używać cudzysłowu, a nie pojedynczych cudzysłowów.
źródło
Rozdawanie najpierw najdłuższych plików (np. Może te długie pliki wymagają trochę refaktoryzacji?) I wykluczanie niektórych katalogów dostawców:
źródło
Jeśli chcesz to uprościć, odetnij pośrednika i po prostu zadzwoń
wc
ze wszystkimi nazwami plików:Lub w nowoczesnej składni:
Działa, dopóki w nazwach katalogów lub nazw plików nie ma spacji. I dopóki nie masz dziesiątek tysięcy plików (nowoczesne powłoki obsługują naprawdę długie wiersze poleceń). Twój projekt ma 74 pliki, więc masz dużo miejsca na rozwój.
źródło
wc -l `find . -type f \( -name "*.cpp" -o -name "*.c" -o -name "*.h" \) -print`
Nie potrzebujesz wszystkich tych skomplikowanych i trudnych do zapamiętania poleceń. Potrzebujesz tylko narzędzia o nazwie licznik linii .
Szybki przegląd
W ten sposób otrzymujesz narzędzie
Użyj
line
polecenia, aby uzyskać liczbę plików i liczbę wierszy w bieżącym katalogu (rekurencyjnie)Jeśli chcesz uzyskać więcej szczegółów, po prostu użyj
line -d
.A najlepsze jest to, że możesz dodać
.gitignore
do niego plik konfiguracyjny. Możesz skonfigurować reguły, aby wybierać lub ignorować rodzaj plików do zliczenia, tak jak robisz to w „.gitignore”.Więcej opisu i zastosowania znajduje się tutaj: https://github.com/MorganZhang100/line-counter
źródło
Jeśli plików jest za dużo, lepiej po prostu sprawdzić całkowitą liczbę wierszy.
źródło
Przynajmniej w systemie OS X komendy find + xarg + wc wymienione w niektórych innych odpowiedziach drukują „total” kilka razy na dużych listach i nie podano pełnej sumy. Byłem w stanie uzyskać jedną sumę dla plików .c za pomocą następującego polecenia:
find . -name '*.c' -print0 |xargs -0 wc -l|grep -v total|awk '{ sum += $1; } END { print "SUM: " sum; }'
źródło