C'è un modo per riassumere la dimensione dei file elencati?


20

Questo è il comando che sto usando per elencare alcuni file:

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 così via.

Ora voglio calcolare la dimensione totale di questi file riassumendo la quinta colonna. Ho pensato di usare awk, per fare questo, quindi ho testato quanto segue in una directory particolare

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

Non capisco qual è il problema, perché questo errore di sintassi .

Sto pensando di provare

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

anche questo, ma un semplice awkscript non funziona.

Per favore, suggeriscimi o correggimi se sbaglio, o se c'è una soluzione per questo.

Risposte:


26

Prima di tutto, dovresti usare le virgolette singole diritte ( '), non quelle inclinate ( `).

Lo awkscript inline potrebbe essere il seguente:

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

quindi, non è necessario inizializzare total( awkinizializza a zero) e non è necessario eseguire il ciclo, awkesegue già lo script su ogni riga di input.


1
In sintesi, il one-liner sarebbe questo: find . -name \*.extract.sys -size +1000000c -exec ls -lrt {} \; | awk '{ total += $5 }; END { print total }'
helt


16

@enzotib ha già sottolineato qual è il tuo errore di sintassi - vado su un po 'tangente.

Sommare una colonna di numeri è una di quelle cose che continuano a spuntare. Ho finito con questa funzione di shell:

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

Con questo, la tua soluzione diventa:

ls -lrt | sumcol 5

Ciò sommerà i numeri nella colonna 5 e stamperà il valore.


In effetti, mi chiedevo perché non esiste un'utilità standard per questo.
enzotib,

Va direttamente nel mio .aliasesfile.
Konrad Rudolph,

14

Ecco un altro modo per farlo utilizzando du:

find . -name \*.extract.sys -size +1000000c -print0 | du -c --files0-from=- | awk 'END{print $1}'

1
Ottimo uso di du. Bell'esempio Come ulteriore vantaggio, puoi aggiungere l'opzione "-h" a du per ottenere l'output in Gig. Quindi non devi contare cifre e simili. Ho appena eseguito un test su un mucchio di file di dimensioni pari a circa 1188800 kbyte. Quanto è grande? Non importa, du -ch --files0-from=-mi dice che il mio totale è "9.0G". Sweeeet!
Mike S,

Dolce, uso eccellente di du!
Haridsv,

Inoltre, se sei interessato solo al totale, allora pipe du output to tail -1.
Haridsv,

4

Nel caso in cui HP-UX findabbia anche -printfun'opzione, sarebbe utile comporre una formula per bccalcolare:

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

Se la formula diventa troppo grande, può essere calcolata passo dopo passo:

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

1

Con GNU find:

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

Con GNU stat:

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

Con BSD stat:

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

È jqun'utilità? Non sembra trovare sulla distribuzione debian (Debian 4.9.51-1 (2017-09-28) x86_64 GNU / Linux)
Death Metal
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.