Ile linii jest w każdym pliku.
Zastosowanie wc
, pierwotnie dla liczby słów, wierzę, ale może to zrobić linie, słowa, znaki, bajtów, a długość najdłuższej linii. Ta -l
opcja mówi, aby liczyć linie.
wc -l <filename>
Spowoduje to wyświetlenie liczby wierszy w:
$ wc -l /dir/file.txt
32724 /dir/file.txt
Możesz także przesyłać dane do wc
:
$ cat /dir/file.txt | wc -l
32724
$ curl google.com --silent | wc -l
63
Ile linii jest w katalogu.
Próbować:
find . -name '*.pl' | xargs wc -l
inny jednowarstwowy:
( find ./ -name '*.pl' -print0 | xargs -0 cat ) | wc -l
BTW, wc
polecenie liczy nowe kody linii, a nie linie. Kiedy ostatni wiersz w pliku nie kończy się nowym kodem wiersza, nie będzie to liczone.
Możesz użyć grep -c ^, pełny przykład:
#this example prints line count for all found files
total=0
find /path -type f -name "*.php" | while read FILE; do
#you see use grep instead wc ! for properly counting
count=$(grep -c ^ < "$FILE")
echo "$FILE has $count lines"
let total=total+count #in bash, you can convert this for another shell
done
echo TOTAL LINES COUNTED: $total
Ile w sumie linii
Nie jestem pewien, czy zrozumiałem, że prosisz poprawnie. np. spowoduje to wyświetlenie wyników w następującym formacie, pokazującym liczbę wierszy dla każdego pliku:
# wc -l `find /path/to/directory/ -type f`
103 /dir/a.php
378 /dir/b/c.xml
132 /dir/d/e.xml
613 total
Alternatywnie, aby wyświetlić tylko całkowitą liczbę nowych znaków wiersza bez liczenia plik po pliku, może okazać się przydatne następujące polecenie:
# find /path/to/directory/ -type f -exec wc -l {} \; | awk '{total += $1} END{print total}'
613
Co najważniejsze, potrzebuję tego w „czytelnym dla człowieka formacie”, np. 12 346 678 zamiast 12345678
Bash ma wbudowaną funkcję printf :
printf "%0.2f\n" $T
Jak zawsze, istnieje wiele różnych metod, które można wykorzystać do osiągnięcia tych samych rezultatów wymienionych tutaj.
printf
nie odczytuje swoich argumentówstdin
, lecz raczej z wiersza poleceń (porównaj potok doecho
vs potok docat
;cat
czyta zstdin
,echo
nie robi). Zamiast tego użyjprintf "$(find ... | xargs ...)"
do podania wyniku jako argumentuprintf
.W wielu przypadkach może być wystarczające połączenie
wc
polecenia i symbolu wieloznacznego*
.Jeśli wszystkie pliki znajdują się w jednym katalogu, możesz zadzwonić:
Możesz także wymienić kilka plików i katalogów:
To polecenie wyświetli listę plików i ich liczbę wierszy.
Ostatni wiersz będzie sumą wierszy ze wszystkich plików.
Aby rekurencyjnie policzyć wszystkie pliki w katalogu:
Najpierw włącz globstar, dodając
shopt -s globstar
do swojego .bash_profile. Obsługa globstar wymaga wersji Bash ≥ 4.x, którą można zainstalować wbrew install bash
razie potrzeby. Możesz sprawdzić swoją wersję za pomocąbash --version
.Następnie uruchomić:
Zauważ, że to wyjście będzie niepoprawne, jeśli globstar nie jest włączony.
źródło
wc -l **/*
wc: parent_dir/child_dir: read: Is a directory
”To polecenie wyświetli listę kodów wierszy w każdym katalogu:
źródło
nieco późno do gry, ale dostałem sporo błędów argumentów z powyższym ze względu na rozmiar reż. To działało dla mnie:
for i in $(find . -type f); do wc -l $i; done >> /home/counts.txt
źródło
cat
połączy pliki w jeden i wyprowadzi wszystko na standardowe wyjście, możesz to zrobićwc -l
dla całkowitej liczby linii plików w katalogu:źródło
Dodam tylko @malyy odpowiedź na następujące pytania (zbyt duże, by skomentować):
Wiele odpowiedzi używa
wc
opcji pliku wiersza poleceń zxargs
. Problem polega na tym, że xargs jest ograniczony do dość małego rozmiaru zależnego od platformy.Ponadto istnieje różnica między BSD (macOS) a GNU (linux / homebrew)
wc
.GNU jeden jest idealny, ponieważ może odczytywać listę plików z pliku zamiast argumentów (
--files0
).Jeśli korzystasz z komputera Mac i masz Homebrew, wykonaj następujące czynności:
Zauważ gwc zamiast wc .
źródło