Temos um aplicativo PHP e queremos contar todas as linhas de código em um diretório específico e seus subdiretórios. Não precisamos ignorar comentários, pois estamos apenas tentando ter uma idéia aproximada.
wc -l *.php
Esse comando funciona muito bem em um determinado diretório, mas ignora os subdiretórios. Eu estava pensando que isso poderia funcionar, mas está retornando 74, o que definitivamente não é o caso ...
find . -name '*.php' | wc -l
Qual é a sintaxe correta para alimentar todos os arquivos?
find . -name '*.php' -o -name '*.inc' | xargs wc -l
wc
será executado várias vezes. Também não lida com muitos nomes de arquivos especiais.find . -name "*.php" -not -path "./tests*" | xargs wc -l
Para outro one-liner:
funciona em nomes com espaços, gera apenas um número.
fonte
man find
.. print0 com xargs -0 permite operar em arquivos que têm espaços ou outros caracteres estranhos em seu nome( find . \( -name '*.h' -o -name '*.cpp' \) -print0 | xargs -0 cat ) | wc -l
Se estiver usando uma versão decentemente recente do Bash (ou ZSH), é muito mais simples:
No shell Bash, isso requer que a
globstar
opção seja definida, caso contrário, o**
operador glob não é recursivo. Para habilitar essa configuração, emitaPara tornar isso permanente, adicione-o a um dos arquivos de inicialização (
~/.bashrc
,~/.bash_profile
etc.).fonte
globstar
definir o Bash para que isso funcione.wc -l **/*.[ch]
encontra um total de 15195373 linhas. Não tenho certeza se você considera isso um "valor muito baixo". Novamente, você precisa ter certeza de terglobstar
ativado o Bash. Você pode verificar comshopt globstar
. Para habilitá-lo explicitamente, façashopt -s globstar
.ARG_MAX
se você tiver um grande número de.php
arquivos, poiswc
não está embutido.find
contiverem espaços. Isso pode ser corrigido usandoprint0
e--null
com as chamadasfind
exargs
, respectivamente.Você pode usar o
cloc
utilitário criado para esse fim exato. Ele informa cada quantidade de linhas em cada idioma, juntamente com quantas delas são comentários, etc. O CLOC está disponível no Linux, Mac e Windows.Exemplo de uso e saída:
fonte
cloc
é multiplataforma, já que é apenas um script Perl?Em sistemas do tipo UNIX, existe uma ferramenta chamada
cloc
que fornece estatísticas de código.Corri em um diretório aleatório em nossa base de código que diz:
fonte
choco install cloc
Você não especificou quantos arquivos existem ou qual é a saída desejada. É isso que você está procurando:
fonte
go () { mkdir /tmp/go; [[ -f ./"$1" ]] && mv ./"$1" /tmp/go; (find ./ -type f -name "$*" -print0 | xargs -0 cat ) | wc -l; wc -l /tmp/go/*; mv /tmp/go/* . }
Os resultados foram perto de slocount para*.py
, mas não sabia*.js
,*.html
.Ainda outra variação :)
Edit: isso dará a soma total, em vez de arquivo por arquivo.
Edit2: Adicione
.
depoisfind
para fazê-lo funcionarfonte
$ find -name \*\.php -print0 | xargs -0 cat | wc -l
find . -name '*.php' | xargs cat | wc -l
... enquanto que isso fornece um arquivo por arquivo e um total geral:find . -name '*.php' | xargs wc -l
Surpreendentemente, não há resposta baseada em encontrar
-exec
eawk
. Aqui vamos nós:Este trecho encontra para todos os arquivos (
-type f
). Para localizar por extensão de arquivo, use-name
:fonte
find . -name '*.c' -print0 |xargs -0 wc -l
. Dito isto, esse método mais rápido (pelo menos no OS X) acaba imprimindo "total" várias vezes, portanto é necessária uma filtragem adicional para obter um total adequado (eu postei detalhes na minha resposta).wc
na forma de acat
é lento porque o sistema deve primeiro processar todos os GB para começar a contar as linhas (testado com 200 GB de jsons, arquivos de 12k). fazendowc
primeiro e depois contar o resultado é muito mais rápidofind . -type f -exec wc -l {} \+
oufind . -name '*.py' -type f -exec wc -l {} \+
que imprime um total no final da saída. Se tudo o que lhe interessa é o total, você pode ir um pouco mais além e usartail
:find . -type f -exec wc -l {} \+ | tail -1
ou #find . -name '*.py' -type f -exec wc -l {} \+ | tail -1
Mais comum e simples quanto a mim, suponha que você precise contar arquivos de diferentes extensões de nome (digamos, também nativos)
Obrigado pelo feedback, eu o corrigi.
fonte
$()
POSIX
Diferentemente da maioria das outras respostas aqui, elas funcionam em qualquer sistema POSIX, para qualquer número de arquivos e com qualquer nome de arquivo (exceto onde indicado).
Linhas em cada arquivo:
Linhas em cada arquivo, classificadas pelo caminho do arquivo
Linhas em cada arquivo, classificadas por número de linhas, decrescente
Total de linhas em todos os arquivos
fonte
Existe uma pequena ferramenta chamada sloccount para contar as linhas de código no diretório Deve-se notar que ele faz mais do que você deseja, pois ignora linhas / comentários vazios, agrupa os resultados por linguagem de programação e calcula algumas estatísticas.
fonte
O que você quer é um
for
loop simples :fonte
xargs
?IFS=$'\n'
antes do loop o corrigia pelo menos para todos os arquivos, exceto as novas linhas em seus nomes. Segundo, você não está citando'*.php'
, então ele será expandido pelo shell e nãofind
, e o ergo não encontrará nenhum arquivo php nos subdiretórios. Também-print
é redundante, pois está implícito na ausência de outras ações.apenas para fontes:
para filtrar, basta usar grep
fonte
Um simples que será rápido, usará todo o poder de pesquisa / filtragem de
find
, não falhará quando houver muitos arquivos (excesso de argumentos numéricos), funcionará bem com arquivos com símbolos engraçados em seu nome, sem usarxargs
, não iniciará um número inutilmente alto de comandos externos (graças a+
forfind
's-exec
). Aqui está:fonte
\;
vez de+
não estar ciente disso), essa resposta deveria ser a resposta correta.Eu sei que a pergunta está marcada como bater, mas parece que o problema que você está tentando resolver também está relacionado ao PHP.
Sebastian Bergmann escreveu uma ferramenta chamada PHPLOC que faz o que você deseja e, além disso, fornece uma visão geral da complexidade de um projeto. Este é um exemplo de seu relatório:
Como você pode ver, as informações fornecidas são muito mais úteis da perspectiva de um desenvolvedor, porque podem dizer a grosso modo como um projeto é complexo antes de começar a trabalhar com ele.
fonte
Acho que ninguém nunca verá isso enterrado na parte de trás ... No entanto, nenhuma das respostas até agora aborda o problema de nomes de arquivos com espaços. Além disso, todo esse uso
xargs
está sujeito a falha se o comprimento total dos caminhos na árvore exceder o limite de tamanho do ambiente de shell (o padrão é alguns megabytes no Linux). Aqui está um que resolve esses problemas de maneira bastante direta. O subshell cuida de arquivos com espaços. oawk
total do fluxo dewc
saídas de arquivos individuais , portanto, nunca deve ficar sem espaço. Também restringeexec
apenas os arquivos (pulando diretórios):fonte
wc -l? Errado! O comando wc conta novos códigos de linha, não linhas! Quando a última linha do arquivo não termina com o novo código de linha, isso não conta!
Se você ainda deseja contar linhas, use grep -c ^ , exemplo completo:
finalmente, cuidado com a armadilha wc -l (conta entra, não linhas !!!)
fonte
grep -c ^
a contagem do número de linhas incompletas , essas linhas incompletas não podem aparecer em um arquivo de texto .find -type f -name '*.php' -print0 | xargs -0 grep -ch ^ | paste -sd+ - | bc
consulte aqui alternativas parabc
: stackoverflow.com/q/926069/2400328muito simplesmente
fonte
Se você deseja que seus resultados sejam classificados por número de linhas, basta adicionar
| sort
ou| sort -r
(-r
por ordem decrescente) à primeira resposta, da seguinte forma:fonte
xargs wc -l
é numérica, seria necessário usarsort -n
ousort -nr
.Para Windows , a ferramenta fácil e rápida é o LocMetrics .
fonte
Algo diferente:
Isso funciona bem, mas você precisa ter pelo menos um
*.php
arquivo na pasta atual ou em uma de suas subpastas, ouwc
pararfonte
Se você estiver no Linux (e acredito que esteja), recomendo minha ferramenta poliglota . É dramaticamente mais rápido que um
sloccount
ou maiscloc
e é mais abrangente quesloccount
.Você pode invocá-lo com
ou
portanto, é muito mais fácil de usar do que algum script bash complicado.
fonte
É muito fácil com os zsh globs:
Se você estiver usando o bash, basta atualizar. Não há absolutamente nenhuma razão para usar o bash.
fonte
A ferramenta Tokei exibe estatísticas sobre o código em um diretório. Tokei mostrará o número de arquivos, o total de linhas dentro desses arquivos e o código, os comentários e os espaços em branco agrupados por idioma. Tokei também está disponível no Mac, Linux e Windows.
Um exemplo da saída de Tokei é o seguinte:
O Tokei pode ser instalado seguindo as instruções no arquivo README no repositório .
fonte
Se você precisar apenas do número total de linhas, digamos seus arquivos PHP, você pode usar um comando de uma linha muito simples, mesmo no Windows, se o GnuWin32 estiver instalado. Como isso:
Você precisa especificar onde exatamente está o find.exe, caso contrário, o FIND.EXE fornecido pelo Windows (a partir dos antigos comandos semelhantes ao DOS) será executado, pois provavelmente antes do GnuWin32 no ambiente PATH e possui parâmetros e resultados diferentes.
Observe que no comando acima você deve usar aspas duplas, não aspas simples.
fonte
Distribuindo os arquivos mais longos primeiro (ou seja, talvez esses arquivos longos precisem de um pouco de refatoração?) E excluindo alguns diretórios de fornecedores:
fonte
Se você quiser simplificar, recorte o intermediário e ligue
wc
com todos os nomes de arquivos:Ou na sintaxe moderna:
Funciona desde que não haja espaços em nenhum dos nomes de diretório ou nomes de arquivos. E desde que você não tenha dezenas de milhares de arquivos (os shells modernos suportam linhas de comando realmente longas). Seu projeto possui 74 arquivos, portanto você tem muito espaço para crescer.
fonte
wc -l `find . -type f \( -name "*.cpp" -o -name "*.c" -o -name "*.h" \) -print`
Você não precisa de todos esses comandos complicados e difíceis de lembrar. Você só precisa de uma ferramenta chamada contador de linhas .
Uma rápida visão geral
É assim que você obtém a ferramenta
Use o
line
comando para obter a contagem de arquivos e a linha no diretório atual (recursivamente)Se você quiser mais detalhes, basta usar
line -d
.E a melhor parte dessa ferramenta é que você pode adicionar
.gitignore
um arquivo de configuração. Você pode configurar regras para selecionar ou ignorar que tipo de arquivos contar, exatamente como o que você faz em '.gitignore'.Mais descrição e uso estão aqui: https://github.com/MorganZhang100/line-counter
fonte
Se os arquivos forem muitos, é melhor procurar apenas a contagem total de linhas.
fonte
Pelo menos no OS X, os comandos find + xarg + wc listados em algumas das outras respostas imprimem "total" várias vezes em listagens grandes e não há um total completo. Consegui obter um total único para arquivos .c usando o seguinte comando:
find . -name '*.c' -print0 |xargs -0 wc -l|grep -v total|awk '{ sum += $1; } END { print "SUM: " sum; }'
fonte