Quantas linhas existem em cada arquivo.
Use wc
, originalmente para contagem de palavras, acredito, mas ele pode fazer linhas, palavras, caracteres, bytes e o maior comprimento de linha. A -l
opção diz para contar linhas.
wc -l <filename>
Isso produzirá o número de linhas em:
$ wc -l /dir/file.txt
32724 /dir/file.txt
Você também pode canalizar dados para wc
:
$ cat /dir/file.txt | wc -l
32724
$ curl google.com --silent | wc -l
63
Quantas linhas estão no diretório
Experimentar:
find . -name '*.pl' | xargs wc -l
outro one-liner:
( find ./ -name '*.pl' -print0 | xargs -0 cat ) | wc -l
BTW, o wc
comando conta novos códigos de linhas, não linhas. Quando a última linha do arquivo não termina com o novo código de linha, isso não conta.
Você pode usar grep -c ^, exemplo completo:
#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
Quantas linhas no total
Não tenho certeza de que entendi que você solicitou corretamente. por exemplo, isso produzirá resultados no seguinte formato, mostrando o número de linhas para cada arquivo:
# wc -l `find /path/to/directory/ -type f`
103 /dir/a.php
378 /dir/b/c.xml
132 /dir/d/e.xml
613 total
Como alternativa, a saída apenas do número total de caracteres de nova linha sem o arquivo por arquivo conta para o seguinte comando pode ser útil:
# find /path/to/directory/ -type f -exec wc -l {} \; | awk '{total += $1} END{print total}'
613
Mais importante, eu preciso disso em "formato legível por humanos", por exemplo. 12.345.678 em vez de 12345678
O Bash possui uma função printf integrada em:
printf "%0.2f\n" $T
Como sempre, existem muitos métodos diferentes que podem ser usados para obter os mesmos resultados mencionados aqui.
printf
não lê seus argumentosstdin
, mas na linha de comando (compare tubulação comecho
vs tubulaçãocat
;cat
lê destdin
,echo
não). Em vez disso, useprintf "$(find ... | xargs ...)"
para fornecer a saída como argumentos paraprintf
.Em muitos casos, combinar o
wc
comando e o curinga*
pode ser suficiente.Se todos os seus arquivos estiverem em um único diretório, você poderá ligar para:
Você também pode listar vários arquivos e diretórios:
Este comando mostra uma lista dos arquivos e seu número de linhas.
A última linha será a soma das linhas de todos os arquivos.
Para contar todos os arquivos em um diretório recursivamente:
Primeiro, ative a globstar adicionando
shopt -s globstar
ao seu .bash_profile. O suporte ao globstar requer o Bash ≥ 4.x, que pode ser instalado com obrew install bash
necessário. Você pode verificar sua versão combash --version
.Então corra:
Observe que esta saída estará incorreta se o globstar não estiver ativado.
fonte
wc -l **/*
wc: parent_dir/child_dir: read: Is a directory
"Este comando fornecerá o código da lista de linhas em cada diretório:
fonte
um pouco atrasado para o jogo, mas recebi um monte de erros de argumento com o acima exposto devido ao tamanho do dir. Isso funcionou para mim:
for i in $(find . -type f); do wc -l $i; done >> /home/counts.txt
fonte
cat
combinaria os arquivos em um e produziria tudo para stdout, você pode fazerwc -l
isso para uma contagem total de linhas de arquivos em um diretório:fonte
Vou apenas aumentar a resposta @malyy para o seguinte (grande para um comentário):
Muitas respostas estão usando a
wc
opção de arquivo de linha de comando comxargs
. O problema disso é que o xargs está limitado a um tamanho dependente da plataforma bastante pequeno.Além disso, há uma diferença entre BSD (macOS) e GNU (linux / homebrew)
wc
.O GNU é ideal porque pode ler a lista de arquivos de um arquivo em vez de argumentos (
--files0
).Se você estiver no mac e tiver um homebrew, faça o seguinte:
Observe o gwc em vez de wc .
fonte