Ordenar tamaños de archivo legibles por humanos

16

¿Cómo puedo ordenar una lista usando una clasificación de tamaño de archivo legible para humanos, una clasificación numérica que tenga en cuenta el identificador de tamaño (G, M, K)? ¿Puedo ordenar la du -shsalida " " por ejemplo?

Problema: considere el problema de enumerar archivos / carpetas y ordenarlos por su tamaño. Puede lograr eso ejecutando:

du -s * | sort -n

Esto enumera los archivos / carpetas ordenados por sus tamaños. Sin embargo, el valor del tamaño impreso está en bytes (o megabytes o gigabytes si lo desea).

Sería deseable poder ordenar en función de los valores legibles por humanos, para poder ejecutar algo análogo a

du -sh * | <human-readable file sort>

Y tener una carpeta de 1.5GB aparece después de 2.0M.

notnoop
fuente

Respuestas:

29

Use GNU coreutils> = 7.5:

du -hs * | ordenar -h

(Tomado de esta pregunta por defecto del servidor )

Página man

Editar: puede verificar sus versiones usando du --versiony sort --versionsi está usando las versiones de GNU. Si usa homebrew, es posible que necesite usar gduy gsort.

Jason Axelson
fuente
8
OSX no tiene esta opción. Puede usar homebrew para brew install coreutils(que antepone todos los comandos coreutils con una 'g'). Entonces puedes hacer gdu -hs * | gsort -h.
dsummersl
1
Solo para aclarar el punto de @ dsummersl: du -hs *funciona bien en Mac OS X, pero sort -hregresa sort: invalid option -- h. También se puede instalar el paquete coreutils a través de MacPorts como se describe aquí .
jvriesem
3

Si solo le preocupan los archivos de más de 1 MB, como parece, puede usar este comando para ordenarlos y usar awk para convertir el tamaño a MB:

du -s * | sort -n | awk '{print int($1 / 1024)"M\t"$2}'

Nuevamente, esto redondea los tamaños al MB más cercano. Puedes modificarlo convirtiéndolo en la unidad que elijas.

Patricio
fuente
Esto es similar a: du -sm * | sort -n. -s/ -grealiza dutamaños de salida en megabytes / gigabytes.
notnoop
Para MB tienes que dividir entre 1024 más. Así seráint($1 / (1024 * 1024))
Pratik Khadloya
2

Este maneja nombres de archivos con espacios en blanco o apóstrofes, y funciona en sistemas que no admiten xargs -do sort -h:

du -s * | sort -n | cut -f2 | tr '\n' '\0' | xargs -0 -I {} du -sh "{}"

lo que resulta en:

368K    diskmanagementd
392K    racoon
468K    coreaudiod
472K    securityd
660K    sshd
3.6M    php-fpm
Mark Crossfield
fuente
1

Aqui hay otro más:

$ du -B1 | sort -nr | perl -MNumber::Bytes::Human=format_bytes -F'\t' -lane 'print format_bytes($F[0])."\t".$F[1]'

Puede que tengas que hacer un

$ cpan Number::Bytes::Human

primero.

0x89
fuente
1

du -sk * | ordenar -n | awk '{print $ 2}' | mientras lee f; do du -sh "$ f"; hecho


fuente
1

Este comando se ordenará por tamaño en MB

du --block-size=MiB --max-depth=1 path | sort -n
lukmansh
fuente
Eso es lo que el usuario está haciendo en realidad, él / ella simplemente no dio el ejemplo con MiB sino que lo mencionó. Lo que él / ella está buscando es ser capaz de resolver cuando se utiliza el -hindicador de du.
Tonin
0

Terminé aquí porque estaba tratando de ordenar algo más que combinara MB y GB en la misma salida y no pude controlarlo.

$NFse usa ya que el patrón #GBo #MBera la última columna en la salida:

somecommand | \
gawk '{
  if ($NF ~ /[0-9\.]+GB/) 
    { a=gensub(/([0-9\.]+)(GB)/,"\\1","g",$NF); \
    printf "%sMB\n", a*1024} \
  else {print $NF} 
}' | \
sort -n

Explicación del comando awk:

if ($NF ~ /[0-9\.]+GB/)

si la última columna coincide con el patrón regex que contiene un dígito o una .o más veces seguido deGB

{ a=gensub(/([0-9\.]+)(GB)/,"\\1","g",$NF); \

luego establezca la variable aen la porción de dígitos de cada línea que coincida con el mismo patrón de expresiones regulares en la misma última columna ( $NF)

printf "%sMB\n", a*1024} \

después de configurar a, use printfpara formatear la salida como${a*1024}MB

else {print $NF}

de lo contrario solo imprima la última columna

sort -n

usar ordenación numérica en la salida


ejemplo

echo "4MB\n5GB\n420MB\n420GB\n1024MB\n1GB" | \                                                                                                                                 23:43:06 (EMP-2653/package-upgrades) Ø M
gawk '{
  if ($NF ~ /[0-9\.]+GB/)
    { a=gensub(/([0-9\.]+)(GB)/,"\\1","g",$NF); \
    printf "%sMB\n", a*1024} \
  else {print $NF}
}' | \
sort -n

Estoy seguro de que hay una manera de reutilizar el patrón regex, así que solo estoy realizando el partido una vez y reemplazando en su lugar, pero aún no sé cómo hacerlo :)

Jens Bodal
fuente