Adicionei um alias do git para me fornecer a contagem de linhas de arquivos específicos no meu histórico:
[alias]
lines = !lc() { git ls-files -z ${1} | xargs -0 wc -l; }; lc
No entanto, wc -l
está relatando vários totais, de modo que, se eu tiver mais de ~ 100k linhas, ele informará o total para elas e depois seguirá em frente. Aqui está um exemplo:
<100k linhas (saída desejada)
$ git lines \*.xslt
46 packages/NUnit-2.5.10.11092/doc/files/Summary.xslt
232 packages/NUnit-2.5.10.11092/samples/csharp/_UpgradeReport_Files/UpgradeReport.xslt
278 total
> 100k linhas (teve que canalizar para grep "total"
)
$ git lines \*.cs | grep "total"
123569 total
107700 total
134796 total
111411 total
44600 total
Como obtenho um total verdadeiro wc -l
, e não uma série de subtotais?
xargs
, nãowc
. Ainda estou interessado em como corrigi-lo e não vejo uma boa solução nas respostas.wc
suporta a--files0-from
opção? Então você pode fazer{ git ls-files -z ${1} | wc -l --files0-from=- ; }
wc: unrecognized option '--files0-from=-'
Respostas:
Tente isso e peça desculpas por ser óbvio:
ou, com git:
Se você realmente deseja que a saída se pareça com a
wc
saída, com contagens individuais e uma soma, você pode usarawk
para adicionar as linhas individuais:Isso não será alinhado tão bem quanto o
wc
faz, caso isso seja importante para você. Para fazer isso, você precisará ler toda a entrada e salvá-la, calculando o total e, em seguida, usar o total para calcular a largura do campo antes de usá-lo para imprimir uma saída formatada das linhas lembradas. Como projetos de reforma de casas, osawk
scripts nunca são realmente finalizados.(Observação para editores entusiasmados: a expressão regular na primeira
awk
condição ocorre no caso de haver um arquivo cujo nome comece com "total" e um espaço; caso contrário, a condição poderia ter sido muito mais simples$2 == "total"
.)fonte
git ls-files -z ${1} | xargs -0 cat | wc -l
). No entanto, estou faltando a contagem de linhas por arquivo que wc -l fornece como no meu primeiro exemplo acima. Alguma maneira de obter o melhor dos dois mundos aqui?grep -v
para soltar o total de linhas, e uma vez do jeito que eu sugiro obter o total total. Ou você pode tentar a solução awk na resposta editada,git ls-files -z ${1} | xargs -0 wc -l | awk '/^[[:space:]]*[[:digit:]]+[[:space:]]+total$/{next} {total+=$1;print} END {print "\n Total:",total,"lines"}'
Se você estiver executando o Linux,
wc
provavelmente é proveniente do GNU Coreutils e tem a--files0-from
opção de ler um arquivo (ou stdin) contendo uma lista arbitrariamente longa de nomes de arquivos terminados em NUL a serem contados. A documentação do GNU Coreutils wc diz "Isso é útil quando a lista de nomes de arquivos é tão longa que pode exceder uma limitação do comprimento da linha de comando. Nesses casos, executar o wc via xargs é indesejável, porque divide a lista em pedaços e faz com que o wc seja impresso". um total para cada sublist e não para a lista inteira ".Então tente o seguinte:
Edit: Como você
wc
é do último milênio e não tem essa opção, aqui está uma solução mais portátil, supondo que você tenhaawk
e não tenha nenhum arquivo chamado "total". Ele filtrará a saída dewc
, omitindo todas astotal
linhas, resumindo-as e imprimindo o total geral no final.Uma coisa que não sei é se a
git
implementação do alias terá problemas com aspas simples$1
e$2
internas, que precisam ser passadas inalteradasawk
.fonte
xargs
ewc
você está correndo são da Cygwin? Você pode colar a saída dewc --version
?$ wc --version wc (GNU textutils) 2.0 Written by Paul Rubin and David MacKenzie. Copyright (C) 1999 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
C:\Program Files (x86)\Git\bin\wc.exe
--files0-from
.O problema é
xargs
dividir o comando em várias execuções, assimwc
como reportar o total de cada vez. Você tem algumas opções, você pode manter as coisas como estão e analisar awc
saída:Você pode criar os arquivos:
Ou você pode pular
xargs
completamente (adaptado daqui ):Isso será interrompido se sua lista de arquivos for maior que ARG_MAX .
fonte
fonte