¿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 -sh
salida " " 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.
brew install coreutils
(que antepone todos los comandos coreutils con una 'g'). Entonces puedes hacergdu -hs * | gsort -h
.du -hs *
funciona bien en Mac OS X, perosort -h
regresasort: invalid option -- h
. También se puede instalar el paquete coreutils a través de MacPorts como se describe aquí .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:
Nuevamente, esto redondea los tamaños al MB más cercano. Puedes modificarlo convirtiéndolo en la unidad que elijas.
fuente
du -sm * | sort -n
.-s
/-g
realizadu
tamaños de salida en megabytes / gigabytes.int($1 / (1024 * 1024))
Este maneja nombres de archivos con espacios en blanco o apóstrofes, y funciona en sistemas que no admiten
xargs -d
osort -h
:lo que resulta en:
fuente
Aqui hay otro más:
Puede que tengas que hacer un
primero.
fuente
du -sk * | ordenar -n | awk '{print $ 2}' | mientras lee f; do du -sh "$ f"; hecho
fuente
Este comando se ordenará por tamaño en MB
fuente
-h
indicador de du.Terminé aquí porque estaba tratando de ordenar algo más que combinara MB y GB en la misma salida y no pude controlarlo.
$NF
se usa ya que el patrón#GB
o#MB
era la última columna en la salida: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
a
en 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
, useprintf
para 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
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 :)
fuente