Dada una lista de archivos files.txt
, puedo obtener una lista de sus tamaños de esta manera:
cat files.txt | xargs ls -l | cut -c 23-30
que produce algo como esto:
151552
319488
1536000
225280
¿Cómo puedo obtener el total de todos esos números?
alias sum="paste -sd+ - | bc"
agregado a la finalización del shell, gracias amigo. . .| x=$(echo <(cat)); echo $((0+${x// /+}+0))
si quieres toda la fiesta todo el tiempo:/usr/bin/sum
bc
no está disponible en algunos sistemas!awk
, por otro lado, es (creo) necesario para el cumplimiento de POSIX.Aquí va
fuente
cut
? Eso es un número de columna predecible, por lo que su uso... | xargs ls -l | awk '{total = total + $5}{END{print total}'
total+=$1
lugar detotal = total + $1
En lugar de usar cut para obtener el tamaño del archivo de la salida de ls -l , puede usar directamente:
Awk interpreta "$ 5" como la quinta columna. Esta es la columna de ls -l que le da el tamaño del archivo.
fuente
cat no funcionará si hay espacios en los nombres de archivo. aquí hay un perl one-liner en su lugar.
fuente
O si solo desea sumar los números, ingrese:
fuente
... | python -c'import sys; print(sum(int(x) for x in sys.stdin))'
cuando Python 2 desaparece a finales de este año.TMTWWTDI : Perl tiene un operador de tamaño de archivo (-s)
fuente
Todo ls -l y luego cut es bastante complicado cuando tienes stat . También es vulnerable al formato exacto de ls -l (no funcionó hasta que cambié los números de columna para cortar )
Además, reparó el uso inútil del gato .
fuente
<infile command
es lo mismo que (y en un orden mejor que)command <infile
.si no tiene instalado bc, intente
en vez de
$( )
<- devuelve el valor de ejecutar el comando$(( 1+2 ))
<- devuelve los resultados evaluadosecho
<- repítelo en la pantallafuente
Puede usar el siguiente script si solo desea usar scripts de shell sin awk u otros intérpretes:
fuente
Yo usaría "du" en su lugar.
Si solo quieres el número:
fuente
files.txt
sea grande. Si el número de argumentos canalizadosxargs
alcanza cierto umbral, los divide en varias llamadas adu
. El total que se muestra al final es el total de la última llamadadu
, no la lista completa.En ksh:
fuente
cut
, pero se ignora awks capacidad de hacer los cálculos ...Pipe to gawk:
fuente
Aquí está el mío
fuente
fuente
Me gusta usar ....
mostrarán la suma de cada línea ...
aplicando sobre esta situación:
Total es el último valor ...
fuente
Puede usar el awk para hacer lo mismo, incluso omite los no enteros
o puede usar el comando ls y calcular la salida legible por humanos
fuente
awk '{ total += $1} END {print total}' files.txt
es más rápidoEn mi opinión, la solución más simple para esto es el comando "expr" unix:
fuente
Puro golpe
fuente
O podrías simplemente sumarlos mientras lees los tamaños
Si no te importan los tamaños de mordida y los bloques está bien, entonces solo
fuente
Si tiene R, puede usar:
Como me siento cómodo con R, en realidad tengo varios alias para cosas como esta, así que puedo usarlos
bash
sin tener que recordar esta sintaxis. Por ejemplo:que me deja hacer
Inspiración: ¿Hay alguna manera de obtener el mínimo, el máximo, la mediana y el promedio de una lista de números en un solo comando?
fuente