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: 320403345Siento 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

lsafind. Lo estoy volviendo a poner como estaba.xargses 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 -lhen 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á1Kpara 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,7Gse ordena después8M.fuente