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