Contando linhas de código?

19

se eu quiser contar as linhas de código, o trivial é

cat *.c *.h | wc -l

Mas e se eu tiver vários subdiretórios?

    
por Niklas Rosencrantz 08.06.2016 / 13:28

10 respostas

44

A maneira mais fácil é usar a ferramenta chamada cloc . Use desta maneira:

cloc .

É isso. : -)

    
por 08.06.2016 / 18:24
39

Você provavelmente deve usar SLOCCount ou cloc para isso, eles são projetados especificamente para contar linhas de código-fonte em um projeto, independentemente da estrutura de diretórios etc .; ou

sloccount .

ou

cloc .

produzirá um relatório sobre todo o código fonte a partir do diretório atual.

Se você quiser usar find e wc , o GNU wc tem uma boa opção --files0-from :

find . -name '*.[ch]' -print0 | wc --files0-from=-

(Agradecimentos a SnakeDoc pelo sugestão do cloc !)

    
por 08.06.2016 / 13:40
8

Como o comando wc pode receber vários argumentos, você pode passar todos os nomes de arquivos para wc usando o argumento + da ação -exec do GNU find :

find . -type f -name '*.[ch]' -exec wc -l {} +

Como alternativa, em bash , usando a opção de shell globstar para percorrer os diretórios recursivamente:

shopt -s globstar
wc -l **/*.[ch]

Outras camadas atravessam recursivamente por padrão (por exemplo, zsh ) ou têm opções semelhantes, como globstar , bem, pelo menos a maioria.

    
por 08.06.2016 / 13:51
5

Você pode usar find junto com xargs e wc :

find . -type f -name '*.h' -o -name '*.c' | xargs wc -l
    
por 08.06.2016 / 13:36
4

Como foi apontado nos comentários, cat file | wc -l não é equivalente a wc -l file porque o primeiro imprime somente um número enquanto o segundo imprime um número e o nome do arquivo. Da mesma forma, cat * | wc -l imprimirá apenas um número, enquanto wc -l * imprimirá uma linha de informações para cada arquivo.

No espírito da simplicidade, vamos revisitar a pergunta feita:

if I want to count the lines of code, the trivial thing is

cat *.c *.h | wc -l

But what if I have several subdirectories?

Em primeiro lugar, você pode simplificar até mesmo seu comando trivial para:

cat *.[ch] | wc -l

E, finalmente, o equivalente a muitos subdiretórios é:

find . -name '*.[ch]' -exec cat {} + | wc -l

Isso poderia ser melhorado de várias maneiras, como restringir os arquivos correspondentes apenas a arquivos regulares (não diretórios) adicionando -type f - mas o comando find fornecido é o recursivo exato equivalente de cat *.[ch] .

    
por 10.06.2016 / 04:12
4

Se você estiver em um ambiente no qual você não tem acesso a cloc etc, sugiro

find -name '*.[ch]' -type f -exec cat '{}' + | grep -c '[^[:space:]]'

Run-through: find pesquisa recursivamente todos os arquivos regulares cujo nome termina em .c ou .h e executa cat neles. A saída é canalizada através de grep para contar todas as linhas não em branco (aquelas que contêm pelo menos um caractere sem espaçamento).

    
por 10.06.2016 / 08:22
3

Amostra usando awk :

find . -name '*.[ch]' -exec wc -l {} \; |
  awk '{SUM+=$1}; END { print "Total number of lines: " SUM }'
    
por 08.06.2016 / 13:38
1

comando fácil:

find . -name '*.[ch]' | xargs wc -l
    
por 08.06.2016 / 14:25
0

Se você está no Linux, eu recomendo minha própria ferramenta, poliglota . É muito mais rápido que cloc e mais recursos que sloccount .

Você deve ser capaz de construir no BSD também, embora não haja binários fornecidos.

Você pode invocá-lo com

poly .
    
por 01.03.2018 / 04:07
-2

find . -name \*.[ch] -print | xargs -n 1 wc -l deve fazer o truque. Há várias variações possíveis disso, como usar -exec em vez de enviar a saída para wc .

    
por 08.06.2016 / 13:32