A maneira mais fácil é usar a ferramenta chamada cloc
. Use desta maneira:
cloc .
É isso. : -)
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?
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 !)
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.
Você pode usar find
junto com xargs
e wc
:
find . -type f -name '*.h' -o -name '*.c' | xargs wc -l
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]
.
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).
Amostra usando awk
:
find . -name '*.[ch]' -exec wc -l {} \; |
awk '{SUM+=$1}; END { print "Total number of lines: " SUM }'
comando fácil:
find . -name '*.[ch]' | xargs wc -l
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 .
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
.
Tags source-code recursive