Existe uma maneira de resumir o tamanho dos arquivos listados?

20

Este é o comando que estou usando para listar alguns arquivos:

find . -name \*.extract.sys -size +1000000c -exec ls -lrt {} \;
-rw-r--r--   1 qa1wrk15   test       1265190 Sep 29 01:14 ./var/can/projs/ar/rep/extract/Sep/29/ar.ARAB-PI_7.20110929.extract.sys
-rw-r--r--   1 qa1wrk15   test       1345554 Sep 29 01:14 ./var/can/projs/ar/rep/extract/Sep/29/ar.ARAB-PI_2.20110929.extract.sys
-rw-r--r--   1 qa1wrk15   test       1370532 Sep 29 01:14 ./var/can/projs/ar/rep/extract/Sep/29/ar.ARAB-PI_3.20110929.extract.sys
-rw-r--r--   1 qa1wrk15   test       1399854 Sep 29 01:14 ./var/can/projs/ar/rep/extract/Sep/29/ar.ARAB-PI_8.20110929.extract.sys

e assim por diante.

Agora, quero calcular o tamanho total desses arquivos, somando a quinta coluna. Pensei em usar awk , para fazer isso, então testei o seguinte em um diretório específico

>ls -lrt | awk '{ print $1 }'
ksh: syntax error at line 1 : '{' unmatched

Eu não entendo qual é o problema, por que esse erro de sintaxe .

Estou pensando em tentar

ls -lrt | awk 'BEGIN {total = 0} {for(i=0;i<NR;i++){total+=$5}} END {printf "%d",total} 

isso também, mas um simples script awk não está funcionando.

Por favor sugira ou me corrija se eu estiver errado, ou se houver uma solução alternativa para isso.

    
por munish 29.09.2011 / 08:07

5 respostas

24

Primeiro, você deve usar aspas simples ( ' ), não as inclinadas ( ' ).

O script awk inline pode ser o seguinte:

ls -lrt | awk '{ total += $5 }; END { print total }'

então, não é necessário inicializar total ( awk inicializa para zero), e não há necessidade de loop, awk já executa o script em todas as linhas de entrada.

    
por 29.09.2011 / 09:03
16

@enzotib já apontou qual é o seu erro de sintaxe - vou fazer um pouco de tangente.

A soma de uma coluna de números é uma daquelas coisas que continuam aparecendo. Acabei com esta função de shell:

sumcol() 
{ 
    awk "{sum+=\$$1} END {print sum}"
}

Com isso, sua solução se torna:

ls -lrt | sumcol 5

Isso somará os números na coluna 5 e imprimirá o valor.

    
por 29.09.2011 / 11:19
11

Aqui está outra maneira de fazer isso usando du :

find . -name \*.extract.sys -size +1000000c -print0 | du -c --files0-from=- | awk 'END{print $1}'
    
por 29.09.2011 / 12:48
4

No caso de o HP-UX find também ter a opção -printf , isso seria útil para compor uma fórmula para bc calcular:

( find . -name \*.extract.sys -size +1000000c -printf '%s+'; echo 0 ) | bc

Se a fórmula ficar muito grande, ela poderá ser calculada passo a passo:

( find . -name \*.extract.sys -size +1000000c -printf 's+=%s\n'; echo s ) | bc
    
por 29.09.2011 / 13:29
1

Com o GNU find :

find -name '*.extract.sys' -size +1000000c -printf '%s\n' | jq -s add

Com o GNU stat :

find . -name '*.extract.sys' -size +1000000c -exec stat -c%s '{}' + | jq -s add

com BSD stat :

find . -name '*.extract.sys' -size +1000000c -exec stat -f%z '{}' + | jq -s add
    
por 08.01.2016 / 20:55