¿Hay alguna forma de resumir el tamaño de los archivos enumerados?


20

Este es el comando que estoy usando para enumerar algunos archivos:

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

y así.

Ahora quiero calcular el tamaño total de estos archivos resumiendo la quinta columna. Pensé en usar awk, para hacer esto, así que probé lo siguiente en un directorio particular

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

No entiendo cuál es el problema, por qué este error de sintaxis .

Estoy pensando en probar

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

esto también, pero un awkscript simple no funciona.

Sugiérame o corríjame si estoy equivocado o si hay una solución para esto.

Respuestas:


26

En primer lugar, debe usar comillas simples ( '), no las inclinadas ( `).

El awkscript en línea podría ser el siguiente:

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

por lo tanto, no es necesario inicializar total(lo awkinicializa a cero) y no es necesario realizar un bucle, awkya ejecuta el script en cada línea de entrada.


1
En resumen, la respuesta sería esta: find . -name \*.extract.sys -size +1000000c -exec ls -lrt {} \; | awk '{ total += $5 }; END { print total }'
helt


16

@enzotib ya ha señalado cuál es su error de sintaxis: voy a hacer una pequeña tangente.

Sumar una columna de números es una de esas cosas que sigue apareciendo. Terminé con esta función de shell:

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

Con esto, su solución se convierte en:

ls -lrt | sumcol 5

Eso sumará los números en la columna 5 e imprimirá el valor.


En efecto, me preguntaba por qué no hay una utilidad estándar para eso.
enzotib

Va directamente a mi .aliasesarchivo.
Konrad Rudolph

14

Aquí hay otra forma de hacer esto usando du:

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

1
Excelente uso de du. Buen ejemplo Como beneficio adicional, puede agregar la opción "-h" a du para obtener la salida en Gig. Entonces no tienes que contar dígitos y demás. Acabo de ejecutar una prueba en un montón de archivos que tienen un tamaño aproximado de 1188800 kbytes. ¿Como de grande es? No importa, du -ch --files0-from=-me dice que mi total es "9.0G". Sweeeet!
Mike S

Dulce, excelente uso de du!
haridsv

Además, si solo está interesado en el total, entonces canalice la salida a tail -1.
haridsv

4

En caso de que HP-UX findtambién tenga una -printfopción, sería útil componer una fórmula parabc calcular:

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

Si la fórmula se vuelve demasiado grande, se puede calcular paso a paso:

( 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

Es jquna utilidad? No parece encontrar en la distribución de Debian (Debian 4.9.51-1 (2017-09-28) x86_64 GNU / Linux)
Death Metal
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.