2011-03-06 18 views
6

¿Cuál es la mejor práctica para imprimir una lista de los 10 principales archivos más grandes en un shell POSIX? Tiene que haber algo más elegante que mi solución actual:Lista ordenada, recursiva, ordenada, legible, de los archivos más grandes

DIR="." 
N=10 
LIMIT=512000 

find $DIR -type f -size +"${LIMIT}k" -exec du {} \; | sort -nr | head -$N | perl -p -e 's/^\d+\s+//' | xargs -I {} du -h {} 

donde LIMIT es un umbral de tamaño de archivo para limitar los resultados de hallazgo.

+0

¿Has probado con 'du'? –

+0

@TomaszNurkiewicz Sí (ver el script de arriba). El problema es que 'du' no ordena los resultados. – Matti

+0

Dado un bloque aleatorio en un sistema de archivos, ¿es posible encontrar el nombre de archivo asociado a él? (Para esos bloques que están en un archivo/directorio). Si es así, esa sería una forma muy eficiente de encontrar los archivos más grandes. (Estoy bastante seguro de que la respuesta es No, busqué en Google antes, pero tal vez SO encuentre algo.) ¿Depende del sistema de archivos? –

Respuesta

6

Esto usa awk para crear columnas adicionales para las claves de clasificación. Solo llama al du una vez. La salida debe verse exactamente como du.

Lo he dividido en varias líneas, pero se puede recombinar en un solo liner.

du -h | 
    awk '{printf "%s %08.2f\t%s\n", 
    index("KMG", substr($1, length($1))), 
    substr($1, 0, length($1)-1), $0}' | 
    sort -r | cut -f2,3 

Explicación:

  • de empezar - crear una cadena de índice para sustituir 1, 2, 3 para K, M, G para agrupar por unidades, si no hay unidad (el tamaño es menor de 1K), entonces no hay coincidencia y se devuelve un cero (¡perfecto!)
  • imprime los nuevos campos - unidad, valor (para hacer que alfa-clasificación funcione correctamente, no tiene relleno, longitud fija) y línea original
  • indexar el último carácter del campo de tamaño
  • tire hacia afuera la parte numérica del tamaño
  • Ordenar los resultados, deseche las columnas adicionales

Inténtelo sin el comando cut para ver lo que está haciendo.

Editar:

Aquí está una versión que hace la clasificación dentro del script AWK y no necesita cortar:

du -h | 
    awk '{idx = sprintf("%s %08.2f %s", 
     index("KMG", substr($1, length($1))), 
     substr($1, 0, length($1)-1), $0); 
     lines[idx] = $0} 
    END {c = asorti(lines, sorted); 
     for (i = c; i >= 1; i--) 
      print lines[sorted[i]]}' 
Cuestiones relacionadas