Muitas das soluções abaixo funcionam apenas para um arquivo (por exemplo foo.c). Alguma idéia sobre o número total de linhas em um projeto (por exemplo, muitos arquivos na estrutura de diretórios e exclusão de arquivos binários)?
precisa saber é o seguinte
5
@solvingPuzzles Acho que posso responder a essa parte. Para qualquer solução que funcione em um arquivo, por exemplo, "cat FILE | sed blah", você pode trabalhar em muitos arquivos substituindo "cat FILE" por um comando que lista os nomes de arquivos nos quais operar, por exemplo, "find. -Name '* .py '"e canalize-o para" xargs cat ". por exemplo, "find. -name '* .py' | xargs cat | sed '/ ^ \ s * $ / d' | wc -l"
Jonathan Hartley
2
@JonathanHartley @solvingPuzzles há também programas como sloce clocque estamos aqui para fazer essas código linhas contagem.
AsTeR 17/02
OP aqui: Quando perguntei esse problema, o 'cloc' não fez um bom trabalho no código Python. Hoje em dia é ótimo.
Jonathan Hartley
O cloc também está disponível como um módulo npm e economiza muito tempo.
Krishna Vedula
Respostas:
193
cat foo.c | sed '/^\s*$/d'| wc -l
E se você considerar os comentários em linhas em branco:
Não sei por que você está usando gato lá. Use foo.c ou foo.pl como o nome do arquivo para passar para sed. sed '/ ^ \ s * $ / d' foo.c | wc -l
Andy Lester
28
Apenas hábito. Eu li os pipelines da esquerda para a direita, o que significa que geralmente começo com gato, depois ação, ação, ação etc. Claramente, o resultado final é o mesmo.
Michael Cramer
32
Para fazer isso em todos os arquivos de todas as subpastas e excluir comentários com '//', estenda este comando para isso: find. -type f -name '* .c' -exec cat {} \; | / / \ \ * * / /; // ^ \ s * $ / d; / ^ \ s * \ / \ // d '| wc -l
Benjamin Intal
11
Você pode ler esquerda para a direita, sem UUOC: < foo.pl sed 'stuff' | wc -l.
achou
22
De um modo geral, o UUOC não é importante, mas a legibilidade é.
A descrição acima fornecerá a contagem total de linhas de código (linhas em branco removidas) para um projeto (pasta atual e todas as subpastas recursivamente).
Nas opções "./blog" "./punbb" "./js/3rdparty" e "./pma" acima estão as pastas que eu lista negra, pois não escrevi o código nelas. Também .php, .as, .sql, .css, .js são as extensões dos arquivos que estão sendo visualizados. Quaisquer arquivos com uma extensão diferente são ignorados.
Você precisa adicionar um $ao grep ( ...\.js$|...), caso contrário ele corresponderá feature.js.swp.
Xeoncross
Você esqueceu a ancoragem, por isso inclui arquivos errados. E uma versão ainda mais simples com ancoragem:find . | egrep '.\.c$|.\.h$' | xargs cat | sed '/^\s*$/d' | wc -l
Mark Jeronimus
36
Se você deseja usar algo diferente de um script de shell, tente CLOC :
O cloc conta linhas em branco, linhas de comentários e linhas físicas do código fonte em muitas linguagens de programação. Ele foi escrito inteiramente em Perl, sem dependências fora da distribuição padrão do Perl v5.6 e superior (o código de alguns módulos externos está incorporado no cloc) e, portanto, é bastante portátil.
Quando eu fiz essa pergunta, o 'cloc' contava as doutrinas do Python como linhas de código, o que era um IMHO abaixo do ideal. As versões modernas de 'cloc' agora contam como docstrings do Python como comentários, das quais eu gosto muito mais.
Jonathan Hartley
Essa é a resposta correta! Eu apenas tentei cloc e faz o trabalho bem.
21719 LeeMobile
31
Há muitas maneiras de fazer isso, usando utilitários comuns do shell.
Minha solução é:
grep -cve '^\s*$'<file>
Ele procura por linhas no <arquivo> as linhas que não correspondem (-v) que correspondem ao padrão (-e) '^ \ s * $', que é o início de uma linha, seguido por 0 ou mais caracteres de espaço em branco, seguidos no final de uma linha (ou seja, nenhum conteúdo que não seja espaço em branco) e exiba uma contagem de linhas correspondentes (-c) em vez das próprias linhas correspondentes.
Uma vantagem desse método em relação aos métodos que envolvem canalização wcé que você pode especificar vários arquivos e obter uma contagem separada para cada arquivo:
Obrigado! Aliás, o wc fornece uma contagem para cada arquivo fornecido, mais um total.
9139 Jonathan Hartley
1
Não, se você estiver trabalhando nisso, como padrão, conta apenas como um arquivo.
SpoonMeiser 10/11/2009
Esta é a melhor resposta na minha opinião.
simhumileco
-enão é necessário. Essa é a localização posicional normal do padrão e você não está fazendo nada divertido com ele. Mas nada de errado em ser explícito, se esse é o seu estilo.
Jacktose 12/03/19
13
'wc' conta linhas, palavras, caracteres, para contar todas as linhas (incluindo as em branco) use:
wc *.py
Para filtrar as linhas em branco, você pode usar grep:
grep -v '^\s*$'*.py | wc
'-v' diz ao grep para produzir todas as linhas, exceto aquelas que correspondem a '^' é o início de uma linha '\ s *' é zero ou mais caracteres em branco '$' é o final de uma linha * .py é o meu exemplo para todos os arquivos que você deseja contar (todos os arquivos python no diretório atual) canalizam a saída para o wc. Lá vai você.
Estou respondendo minha própria pergunta (genuína). Não foi possível encontrar uma entrada de stackoverflow que cobria isso.
\ W não corresponde a espaços em branco, corresponde a caracteres que não são de palavra. É o oposto de \ w, caracteres da palavra. \ W Corresponderá a qualquer coisa que não seja alfanumérica ou sublinhada e, portanto, não fará o que você afirma aqui. Quer dizer \ s
SpoonMeiser
9
Este comando conta o número de linhas que não estão em branco. cat fileName | grep -v ^$ | wc -l A função de expressão regular grep -v ^ $ ignora as linhas em branco.
Eu votaria nisso apenas porque nunca vi alguém usar pré-incremento em um script awk, mas infelizmente isso conta apenas as linhas em branco. :) Você quer dizer awk '!/^[[:space:]]*$/{++x} END{print x}'. Ou, se você realmente odeia negativos, awk '{y++} /^[[:space:]]*$/{++x} END{print y-x}';)
dannysauer
4
grep -cvE '(^\s*[/*])|(^\s*$)' foo
-c = count
-v = exclude
-E = extended regex
'(comment lines) OR (empty lines)'
where
^= beginning of the line
\s = whitespace
*= any number of previous characters or none
[/*]= either / or *|= OR
$ = end of the line
Eu posto isso porque outras opções deram respostas erradas para mim. Isso funcionou com minha fonte java, onde as linhas de comentário começam com / ou * (eu uso * em todas as linhas no comentário de várias linhas).
Esta é uma solução viável. A única coisa a aviso: não conta comentários ramal
Amol
2
Aqui está um script Bash que conta as linhas de código em um projeto. Ele percorre uma árvore de origem recursivamente e exclui linhas em branco e comentários de linha única que usam "//".
# $excluded is a regex for paths to exclude from line counting
excluded="spec\|node_modules\|README\|lib\|docs\|csv\|XLS\|json\|png"
countLines(){# $total is the total lines of code counted
total=0# -mindepth exclues the current directory (".")for file in`find . -mindepth 1 -name "*.*" |grep -v "$excluded"`;do# First sed: only count lines of code that are not commented with //# Second sed: don't count blank lines# $numLines is the lines of code
numLines=`cat $file | sed '/\/\//d' | sed '/^\s*$/d' | wc -l`# To exclude only blank lines and count comment lines, uncomment this:#numLines=`cat $file | sed '/^\s*$/d' | wc -l`
total=$(($total + $numLines))
echo " " $numLines $file
done
echo " " $total in total
}
echo Source code files:
countLines
echo Unit tests:
cd spec
countLines
Aqui está a aparência da saída para o meu projeto :
. corresponde a espaço em branco. Essa solução só funciona se você considerar uma linha que contém apenas espaços em branco como não em branco, o que tecnicamente é, embora provavelmente não seja isso que você procura.
SpoonMeiser 22/09/08
1
Script para contar recursivamente todas as linhas que não estão em branco com uma certa extensão de arquivo no diretório atual:
#!/usr/bin/env bash(
echo 0;for ext in"$@";dofor i in $(find .-name "*$ext");do
sed '/^\s*$/d' $i | wc -l ## skip blank lines#cat $i | wc -l; ## count all lines
echo +;donedone
echo p q;)| dc;
\ W é caracteres que não são da palavra; isso não corresponde a uma linha como ${-[*]} + $@, por exemplo. O que certamente é um código válido em algum lugar do mundo. ;) Você quer dizer \ espaço.
dannysauer
0
Isso fornece a contagem do número de linhas sem contar as linhas em branco:
Ei. 'wc' por si só não pesquisa subdiretórios e não filtra linhas em branco, ambas solicitadas explicitamente na pergunta.
Jonathan Hartley
wcconta linhas em branco. O OP quer contar linhas não em branco. É verdade que ele vai querer usar wc, mas só depois de ter sido corrente editada usandosed
foo.c
). Alguma idéia sobre o número total de linhas em um projeto (por exemplo, muitos arquivos na estrutura de diretórios e exclusão de arquivos binários)?sloc
ecloc
que estamos aqui para fazer essas código linhas contagem.Respostas:
E se você considerar os comentários em linhas em branco:
Embora isso seja dependente da linguagem.
fonte
< foo.pl sed 'stuff' | wc -l
.A descrição acima fornecerá a contagem total de linhas de código (linhas em branco removidas) para um projeto (pasta atual e todas as subpastas recursivamente).
Nas opções "./blog" "./punbb" "./js/3rdparty" e "./pma" acima estão as pastas que eu lista negra, pois não escrevi o código nelas. Também .php, .as, .sql, .css, .js são as extensões dos arquivos que estão sendo visualizados. Quaisquer arquivos com uma extensão diferente são ignorados.
fonte
$
ao grep (...\.js$|...
), caso contrário ele corresponderáfeature.js.swp
.find . | egrep '.\.c$|.\.h$' | xargs cat | sed '/^\s*$/d' | wc -l
Se você deseja usar algo diferente de um script de shell, tente CLOC :
fonte
Há muitas maneiras de fazer isso, usando utilitários comuns do shell.
Minha solução é:
Ele procura por linhas no <arquivo> as linhas que não correspondem (-v) que correspondem ao padrão (-e) '^ \ s * $', que é o início de uma linha, seguido por 0 ou mais caracteres de espaço em branco, seguidos no final de uma linha (ou seja, nenhum conteúdo que não seja espaço em branco) e exiba uma contagem de linhas correspondentes (-c) em vez das próprias linhas correspondentes.
Uma vantagem desse método em relação aos métodos que envolvem canalização
wc
é que você pode especificar vários arquivos e obter uma contagem separada para cada arquivo:fonte
-e
não é necessário. Essa é a localização posicional normal do padrão e você não está fazendo nada divertido com ele. Mas nada de errado em ser explícito, se esse é o seu estilo.'wc' conta linhas, palavras, caracteres, para contar todas as linhas (incluindo as em branco) use:
Para filtrar as linhas em branco, você pode usar grep:
'-v' diz ao grep para produzir todas as linhas, exceto aquelas que correspondem a '^' é o início de uma linha '\ s *' é zero ou mais caracteres em branco '$' é o final de uma linha * .py é o meu exemplo para todos os arquivos que você deseja contar (todos os arquivos python no diretório atual) canalizam a saída para o wc. Lá vai você.
Estou respondendo minha própria pergunta (genuína). Não foi possível encontrar uma entrada de stackoverflow que cobria isso.
fonte
Este comando conta o número de linhas que não estão em branco.
cat fileName | grep -v ^$ | wc -l
A função de expressão regular grep -v ^ $ ignora as linhas em branco.
fonte
cat
nesta cadeia:grep -v ^$ fileName | wl -l
wc -l
porque o grep tem-c
:grep -vc ^$ fileName
fonte
deve fazer o truque muito bem
fonte
fonte
awk '!/^[[:space:]]*$/{++x} END{print x}'
. Ou, se você realmente odeia negativos,awk '{y++} /^[[:space:]]*$/{++x} END{print y-x}'
;)Eu posto isso porque outras opções deram respostas erradas para mim. Isso funcionou com minha fonte java, onde as linhas de comentário começam com / ou * (eu uso * em todas as linhas no comentário de várias linhas).
fonte
Aqui está um script Bash que conta as linhas de código em um projeto. Ele percorre uma árvore de origem recursivamente e exclui linhas em branco e comentários de linha única que usam "//".
Aqui está a aparência da saída para o meu projeto :
Aproveitar! - Curran
fonte
Depende do número de arquivos que você possui no projeto. Em teoria, você poderia usar
Onde você pode preencher a lista de arquivos usando o utilitário de localização.
Daria a você uma contagem de linhas por arquivo.
fonte
Script para contar recursivamente todas as linhas que não estão em branco com uma certa extensão de arquivo no diretório atual:
Uso da amostra:
fonte
Se você deseja a soma de todas as linhas não em branco de todos os arquivos de uma determinada extensão de arquivo em um projeto:
O primeiro argumento é o diretório base do projeto, o segundo é a extensão do arquivo. Uso da amostra:
É pouco mais do que uma coleção de soluções anteriores.
fonte
fornece uma contagem agregada para todos os arquivos no diretório atual e seus subdiretórios.
HTH!
fonte
${-[*]} + $@
, por exemplo. O que certamente é um código válido em algum lugar do mundo. ;) Você quer dizer \ espaço.Isso fornece a contagem do número de linhas sem contar as linhas em branco:
fonte
fornece a contagem de linhas não em branco no diretório de trabalho atual.
fonte
Já existe um programa para isso no linux chamado 'wc'.
Somente
e fornece o total de linhas e as linhas para cada arquivo.
fonte
wc
conta linhas em branco. O OP quer contar linhas não em branco. É verdade que ele vai querer usarwc
, mas só depois de ter sido corrente editada usandosed