Jak policzyć ilość linii w wielu plikach w wybranym rozszerzeniu w Linux?
Ostatnio otrzymałem zapytanie, jak w bash'u
policzyć ilość linijek kodu w plikach php
zlokalizowanych w różnych podfolderach. Postanowiłem zatem zrobić wpis na ten temat.
Zapewne wielu z Was wie, że aby wyświetlić ilość linii w pliku wystarczy w systemie Linux
wydać polecenie:
wc -l nazwa_pliku
W przypadku, gdy chcemy sprawdzić ilość linii w każdym z plików php
w bieżącym folderze wykonamy polecenie:
wc -l *.php
Jak teraz mając rozbudowaną strukturę katalogów i plików z rozszerzeniem np. php
sprawdzić ile łącznie linii znajduje się w plikach w bieżącym katalogu oraz podkatalogach? Spójrzmy na przykładową strukturę oraz dwa przykłady.
W sumie mamy 5
plików php
, jeden w katalogu bieżącym, jeden w katalogu admin i trzy w katalogu sklep.
Przykad 1:
W pierwszym przykładzie wpierw przy pomocy find
oraz grep
wyszukujemy plików z rozszerzeniem php
. Następnie w pętli for
dla każdego pliku wykonujemy polecenie wc -l
z którego bierzemy przy pomocy awk
tylko pierwszy parametr wyniku – czyli liczbę linii (bez nazwy pliku). Przypisujemy ją do zmiennej suma
, której wartość wyświetlamy na końcu.
Na uwagę tutaj zasługuje:
- podwójny znak \\ – w przypadku jego braku
.
(kropka) oznaczałaby dowolny pojedynczy znak, zatem brane pod uwagę byłyby także pliki np:aphp
,bphp
itp. - dodany na końcu znak dolara $ oznacza, że nazwa pliku ma kończyć się na
.php
, zatem wykluczamy w ten sposób pliki typu: jakisplik.phpABC
Gotowy kod wygląda następująco:
let suma=0 let licznik=0 for plik in `find . | grep \\.php$`; do licznik=`wc -l $plik | awk '{print $1}'` let suma=suma+licznik done echo $suma
Zapiszemy go jako plik licznik.sh
i uruchomimy. W wyniku otrzymamy wartość: 12475 gdyż tyle łącznie linii znajduje się w moich plikach.
W tym przykładzie zamiast: find . | grep \\.php$
mogliśmy zastosować oczywiście także: find . -name "*.php"
Przykład 2:
Drugi, znacznie krótszy i prostrzy przykład, przy wykorzystaniu find
z parametrem -name
oraz xargs
i wc -l
:
find . -name "*.php" | xargs wc –l
W wyniku tego polecenia otrzymamy pełną listę plików wraz z ilością linii w każdym z nich, a także w stopce wyniku łączną ilość linii w plikach.
4200 ./admin/admin.php
3000 ./index.php
1260 ./sklep/koszyk.php
1915 ./sklep/logowanie.php
2100 ./sklep/produkty.php
12475 razem