Como encontro o número total de linhas em um conjunto de arquivos encontrados (usando as ferramentas de linha de comando do Linux)?

3

Eu posso encontrar o número de linhas de cada arquivo que corresponde a um padrão específico usando (por exemplo):

$ find . -name "test.save*" -exec wc -l {} \;
673000 ./test.save8.txt
24000 ./from/test1/test.save3.txt
100 ./from/test1/test.save1.txt
513000 ./from/test1/test.save2.txt
2253000 ./from/test1/test.save4.txt
2252000 ./from/test2/test.save3.txt
100 ./from/test2/test.save1.txt
596000 ./from/test2/test.save2.txt
2224000 ./from/test3/test.save3.txt
100 ./from/test3/test.save1.txt
593000 ./from/test3/test.save2.txt
270000 ./from/test4/test.save3.txt
100 ./from/test4/test.save1.txt
332234 ./from/test4/test.save2.txt
2177000 ./from/test4/test.save4.txt
1728000 ./test.save3.txt
180000 ./test.save1.txt
466000 ./test.save11.txt
233000 ./test.save9.txt
686880 ./test.save5.txt
215262 ./test.save7.txt
2560000 ./test.save12.txt
18080 ./test.save10.txt
432000 ./test.save2.txt
10000 ./test.save4.txt
684000 ./test.save6.txt

Como eu adiciono todos os números individuais (usando ferramentas de linha de comando do Linux)?

    
por Daryl Spitzer 27.07.2010 / 20:41

3 respostas

4

Isso deve ser feito:

find ... -exec cat {} \; | wc -l

Se a sua versão de find oferecer suporte, isso será muito mais rápido:

find ... -exec cat {} + | wc -l

ou se você quiser as contagens individuais e o total:

find ... | xargs wc -l

Os dois primeiros lidam com nomes de arquivos com espaços. Para fazer o último acima funcionar se houver nomes de arquivos com espaços, use -print0 e -0 :

find ... -print0 | xargs -0 wc -l
    
por 27.07.2010 / 20:44
2

Não é muito elegante, mas isso faria

#!/bin/bash
#
total=0
for value in $(find . -name "test.save*" -exec wc -l {} \;|awk '{ print $1 }'); do
let total=total+value
done
echo $total
    
por 27.07.2010 / 20:48
1

Você pode levar sua solução original e um pipe para um programa de soma no awk:

find . -name "test.save*" -exec wc -l {} \; | \
  awk '{count += $1} END {print count}'
    
por 29.07.2010 / 06:53