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, resumindo 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

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 awkscript simples não está funcionando.

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

munish
fonte

Respostas:

26

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

O awkscript embutido pode ser o seguinte:

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

portanto, não é necessário inicializar total( awkinicializa com zero) e não é necessário executar um loop, awkjá executa o script em todas as linhas de entrada.

enzotib
fonte
11
Em resumo, o one-liner seria este: find . -name \*.extract.sys -size +1000000c -exec ls -lrt {} \; | awk '{ total += $5 }; END { print total }'
helt
Não analise ls!
Pare de prejudicar Monica
16

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

A soma de uma coluna de números é uma daquelas coisas que continua aparecendo. Eu terminei com esta função 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.

camh
fonte
Na verdade, eu queria saber por que não existe um utilitário padrão para isso.
enzotib 29/09/11
Vai direto para o meu .aliasesarquivo.
21911 Konrad Rudolph
14

Aqui está outra maneira de fazer isso usando du:

find . -name \*.extract.sys -size +1000000c -print0 | du -c --files0-from=- | awk 'END{print $1}'
smoking
fonte
11
Excelente uso do du. Belo exemplo. Como um benefício adicional, você pode adicionar a opção "-h" ao du para obter a saída no Gig. Então você não precisa contar dígitos e tal. Acabei de executar um teste em um monte de arquivos com aproximadamente 1188800 kbytes de tamanho. Quão grande é isso? Não importa, du -ch --files0-from=-me diz que meu total é "9.0G". Sweeeet!
Mike S
Doce, excelente uso do du!
haridsv
Além disso, se você estiver interessado apenas no total, então canalize a saída para tail -1.
precisa saber é
4

Caso o HP-UX findtambém tenha -printfopção, isso seria útil para compor uma fórmula para bccalcular:

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

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

( find . -name \*.extract.sys -size +1000000c -printf 's+=%s\n'; echo s ) | bc
homem a trabalhar
fonte
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 o BSD stat:

find . -name '*.extract.sys' -size +1000000c -exec stat -f%z '{}' + | jq -s add
nisetama
fonte
É jqum utilitário? Não parece encontrar na distribuição debian (Debian 4.9.51-1 (28-09-2017) x86_64 GNU / Linux)
Death Metal