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 -lBut 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