Tengo un sistema de archivos que tiene un par de millones de archivos y me gustaría ver una distribución de tamaños de archivos de forma recursiva en un directorio particular. Siento que esto es totalmente factible con un poco de bash / awk fu, pero podría usar una mano. Básicamente me gustaría algo como lo siguiente:
1KB: 4123
2KB: 1920
4KB: 112
...
4MB: 238
8MB: 328
16MB: 29138
Count: 320403345
Siento que esto no debería ser tan malo dado un bucle y algún tamaño de archivo log2 condicional, pero parece que no puedo llegar allí.
Pregunta relacionada: ¿Cómo puedo encontrar archivos que sean más grandes / más pequeños que x bytes? .
linux
command-line
bash
unix
notpeter
fuente
fuente
ls
afind
. Lo estoy volviendo a poner como estaba.xargs
es significativamente más rápido que-exec
, así que usé ese método.Basado en la respuesta de garyjohn, aquí hay una línea, que también formatea la salida a legible para humanos:
Aquí está la versión ampliada de la misma:
En el primero
awk
, definí un tamaño de archivo mínimo para recopilar todos los archivos de menos de 1 kb en un solo lugar. En el segundoawk
, la funciónhuman(x)
se define para crear un tamaño legible por humanos. Esta parte se basa en una de las respuestas aquí: /unix/44040/a-standard-tool-to-convert-a-byte-count-into-human-kib-mib-etc -like-du-ls1La salida de muestra se ve así:
fuente
Prueba esto:
SALIDA
EXPLICACIÓN
find . -type f -exec ls -lh {} \;
: Bastante simple, encontrar archivos en el directorio actual y ejecutarls -lh
en ellosmatch($5,/([0-9.]+)([A-Z]+)/,k);
: esto extraerá el tamaño del archivo y guardará cada coincidencia en la matrizk
.if(!k[2]){print "1K"}
: sik[2]
no está definido, el tamaño del archivo es <1K. Como me imagino que no le importan esos tamaños tan pequeños, el script se imprimirá1K
para todos los archivos cuyo tamaño es <= 1K.else{printf "%.0f%s\n",k[1],k[2]}
: si el archivo es mayor a 1K, redondea el tamaño del archivo al entero más cercano e imprime junto con su modificador (K, M o G).sort | uniq -c
: cuenta las ocurrencias de cada línea (tamaño de archivo) impresa.sort -hk 2
: ordenar según el segundo campo en formato legible por humanos. De esta manera,7G
se ordena después8M
.fuente