Básicamente busco archivos y luego los ordeno por tamaño. El script funciona si no clasifico el tamaño por legible por humanos. Pero quiero que el tamaño sea legible para los humanos. ¿Cómo puedo clasificar tamaños que sean legibles por humanos?
Por ejemplo:
ls -l | sort -k 5 -n | awk '{print $9 " " $5}'
Esto funciona como se esperaba, obtuve el tamaño de mis archivos en bytes ascendentes:
1.txt 1
test.txt 3
bash.sh* 573
DocGeneration.txt 1131
andres_stuff.txt 1465
Branches.xlsx 15087
foo 23735
bar 60566
2016_stuff.pdf 996850
Ahora, quiero que el tamaño sea legible para humanos, así que agregué un parámetro -h a ls, y ahora algunos archivos están fuera de servicio:
ls -lh | sort -k 5 -n | awk '{print $9 " " $5}'
1.txt 1
DocGeneration.txt 1.2K
andres_stuff.txt 1.5K
test.txt 3
Branches.xlsx 15K
foo 24K
bar 60K
bash.sh* 573
2016_stuff.pdf 974K
-k 5
- ¿Cómo funciona?ls
salidadu
lugar dels
podría ser una buena idea.find
's-printf
con sus%p
y%s
formateadores (seguido de una "humanización" de los tamaños).Respuestas:
Tratar
sort -h k2
Es parte de gnu sort, BSD sort y otros.
fuente
ls
?ls
, y en su lugar usar el globing de archivos directamente. Globbing solo no funcionará aquí. Dicho esto, probablemente preferiríadu
esto.files=(); for f in *; do [[ -L "$f" ]] && files+=("$f"); done; echo ${#files[@]}
(podría tener el cambio de prueba de enlace simbólico incorrecto). Si no te interesan los enlaces simbólicos,files=(*); echo ${#files[@]}
que se vuelven portátiles si los usasset
y no las matrices.ls
tiene esta funcionalidad incorporada, use la-S
opción y ordene en orden inverso:ls -lShr
fuente
-h
no es una opción estándarls
, pero debe ser utilizable si OP ya lo tiene. El resto son estándar, y ciertamente es la respuesta que habría escrito.ls
.-S
podría no estar disponible para ustedls
. FWIW,-S
es compatible incluso con la biblioteca de Emacsls-lisp.el
, que se utiliza cuando el sistema operativo no tienels
. Funciona en Emacs en MS Windows, por ejemplo.-h
puede no estar disponible universalmente, pero OP ya lo está utilizando de todos modos.-S
realmente debería estar universalmente disponible, porque está en el enlace POSIX que proporciona Toby. Sin embargo, existen bastantes kits de herramientas que no son POSIX.Como no se mencionó ningún shell específico, aquí se explica cómo hacer todo en el
zsh
shell:El
**
patrón global coincide como*
pero a través/
de los nombres de ruta, es decir, como lo haría una búsqueda recursiva.El
ls
comando habilitaría tamaños legibles por humanos con-h
, y formato de salida de lista larga con-l
. La-f
opción deshabilita la clasificación, porls
lo que solo enumeraría los archivos en el orden en que se proporcionan.Este orden está organizado por el
**/*(.Lk-1024oL)
patrón global de nombre de archivo para que los archivos más pequeños se enumeren primero. El**/*
bit coincide con cada archivo y directorio en este directorio y debajo, pero(...)
modifica el comportamiento del glob (es un "calificador glob").Es
oL
al final que ordena (o
) los nombres por tamaño de archivo (L
, "longitud").Al
.
principio, el globo solo coincide con los archivos normales (sin directorios).El
Lk-1024
bit selecciona archivos cuyo tamaño es inferior a 1024 KB ("longitud en KB inferior a 1024").Si
zsh
no es su shell interactivo principal, entonces podría usarUse
setopt GLOB_DOTS
(ozsh -o GLOB_DOTS -c ...
) para también hacer coincidir nombres ocultos. ... o simplemente agregueD
a la cadena de calificación global.Ampliando lo anterior, suponiendo que desea una salida de 2 columnas con nombres de ruta y tamaños legibles por humanos, y también suponiendo que tiene
numfmt
de GNU coreutils,o más rápido
fuente
Si
sort
no tiene la-h
opción, puede usar un comando awk (aunque muy largo) como el siguiente:Esto ordenará su salida en bytes y luego los convertirá a su tamaño legible por humanos.
fuente
¿Funcionaría esto?
La primera
awk
exp buscará los archivos de menos de 1M y la segunda tomará el tamaño del byte del resultado y lo convertirá a KB e imprimirá los primeros 3 elementos para obtener un tamaño legible por humanos.fuente