se eu quiser contar as linhas de código, o mais trivial é
cat *.c *.h | wc -l
Mas e se eu tiver vários subdiretórios?
recursive
source-code
Niklas
fonte
fonte
cat
?wc -l *.c *.h
faz a mesma coisa.wc -l *.c *.h | tail -n 1
obter uma saída semelhante.**
, para que você possa ter usadowc -l **/*.{h,c}
ou algo semelhante. Observe que no Bash, pelo menos, esta opção (chamadaglobstar
) está desativada por padrão. Mas também observe que, nesse caso específico,cloc
ouSLOCCount
é uma opção muito melhor. (Além disso,ack
pode ser preferívelfind
para facilmente encontrar / listagem de arquivos de origem.)Respostas:
A maneira mais fácil é usar a ferramenta chamada
cloc
. Use desta maneira:É isso aí. :-)
fonte
Você provavelmente deve usar SLOCCount ou cloc para isso, eles foram projetados especificamente para contar linhas de código-fonte em um projeto, independentemente da estrutura de diretórios etc .; ou
ou
produzirá um relatório com todo o código fonte, começando no diretório atual.
Se você deseja usar
find
ewc
, o GNUwc
tem uma boa--files0-from
opção:(Obrigado ao SnakeDoc pela sugestão do cloc !)
fonte
sloccount /tmp/stackexchange
(criada novamente em 17 de maio após a minha reinicialização mais recente) diz que o custo estimado para desenvolver os arquivos sh, perl, awk, etc encontrados foi de US $ 11.029. e isso não inclui os one-liners que nunca entraram em um arquivo de script.cloc
também é bom: github.com/AlDanial/clocComo o
wc
comando pode receber vários argumentos, você pode passar todos os nomes de arquivos parawc
o+
argumento da-exec
ação do GNUfind
:Como alternativa,
bash
use a opção shellglobstar
para percorrer os diretórios recursivamente:Outras conchas atravessam recursivamente por padrão (por exemplo
zsh
) ou têm opções semelhantes comoglobstar
, bem, pelo menos a maioria delas.fonte
Você pode usar
find
junto comxargs
ewc
:fonte
total
linhas se váriaswc
s estão a ser invocado.)wc
problema dos vários comandos possa ser resolvido através da tubulaçãofind
parawhile read FILENAME; do . . .done
estruturar. E dentro do loop while usewc -l
. O restante está resumindo o total de linhas em uma variável e exibindo-o.Se você estiver em um ambiente onde você não tem acesso,
cloc
etc, eu sugiroExecução:
find
pesquisa recursivamente todos os arquivos regulares cujo nome termina em ou.c
ou.h
e é executadocat
neles. A saída é canalizadagrep
para contar todas as linhas não em branco (aquelas que contêm pelo menos um caractere não espaçador).fonte
Como foi apontado nos comentários, não
cat file | wc -l
é equivalente a porque o primeiro imprime apenas um número, enquanto o último imprime um número e o nome do arquivo. Da mesma forma , imprimirá apenas um número, enquanto imprimirá uma linha de informações para cada arquivo.wc -l file
cat * | wc -l
wc -l *
No espírito da simplicidade, vamos revisitar a pergunta realmente feita:
Em primeiro lugar, você pode simplificar até mesmo seu comando trivial para:
E, finalmente, o equivalente a muitos subdiretórios é:
Talvez isso possa ser melhorado de várias maneiras, como restringir os arquivos correspondentes apenas aos arquivos regulares (não diretórios) adicionando
-type f
- mas ofind
comando fornecido é o equivalente recursivo exatocat *.[ch]
.fonte
Amostra usando
awk
:fonte
+
no lugar de\;
.wc -l
para grupos de arquivos, da mesma forma quexargs
faz, mas lida com caracteres ímpares (como espaços) nos nomes dos arquivos sem a necessidade de umxargs
ou o (não padrão)-print0
e as-0
opções parafind
exargs
respectivamente. É uma otimização menor. A desvantagem seria que cada chamada dewc
produziria uma contagem total de linhas no final quando receber vários arquivos - oawk
script lidaria com isso. Portanto, não é um slam-dunk, mas muitas vezes, usar+
no lugar de\;
withfind
é uma boa idéia.wc
. Se a priori for desconhecido o número de arquivos que serão encontrados , existe o risco de ultrapassar esse limite ou de alguma forma ele é tratado pelo find?find
agrupa os arquivos em pacotes de tamanho conveniente, que não excederão o limite de comprimento para a lista de argumentos na plataforma, permitindo o ambiente (que sai do comprimento da lista de argumentos - portanto, o tamanho da lista de argumentos mais o o comprimento do ambiente deve ser menor que um valor máximo). IOW,find
faz o trabalho certo, comoxargs
faz o trabalho certo.comando fácil:
fonte
total
linhas se váriaswc
s estão a ser invocado.)Se você estiver no Linux, recomendo minha própria ferramenta, poliglota . É dramaticamente mais rápido
cloc
e com mais recursos do quesloccount
.Você também deve poder usar o BSD, embora não haja binários fornecidos.
Você pode invocá-lo com
fonte
find . -name \*.[ch] -print | xargs -n 1 wc -l
deve fazer o truque. Também existem várias variações possíveis, como usar em-exec
vez de canalizar a saídawc
.fonte
find . -name \*.[ch] -print
não imprime o conteúdo dos arquivos, apenas os nomes dos arquivos. Então conto o número de arquivos, não é? Preciso de `xargs '?xargs
e também precisaria assistir a váriaswc
invocações se tiver muitos arquivos; você precisaria procurar todas astotal
linhas e somar.find . -name \*.[ch] -print0 | xargs -0 cat | wc -l
find . -name \*.[ch] -print | wc -l
) conta o número de arquivos (a menos que o nome de um arquivo contenha uma nova linha - mas isso é muito incomum) - não conta o número de linhas nos arquivos.