¿Cómo enumerar el tamaño de cada archivo y directorio y ordenar por tamaño descendente en Bash?

108

Descubrí que no es fácil obtener el tamaño de un directorio en Bash.

Quiero que cuando escribo ls -<some options>, pueda enumerar toda la suma del tamaño del archivo del directorio de forma recursiva y los archivos al mismo tiempo y ordenarlos por orden de tamaño.

¿Es eso posible?

Kit Ho
fuente
2
¿Qué quiere decir exactamente con el "tamaño" de un directorio? ¿La cantidad de archivos debajo de él (recursivamente o no)? ¿La suma de los tamaños de los archivos debajo de él (recursivamente o no)? ¿El tamaño de disco del directorio en sí? (Un directorio se implementa como un archivo especial que contiene nombres de archivos y otra información).
Keith Thompson
debe ser La suma de los tamaños de los archivos debajo de él de forma recursiva
Kit Ho
1
@Kit: Entonces dues la respuesta.
Keith Thompson
El ducomando @KeithThompson @KitHo estima el uso del espacio de archivo, por lo que no puede usarlo si desea obtener el tamaño exacto.
ztank1013
@ ztank1013: Dependiendo de lo que quiera decir con "el tamaño exacto", du(al menos la versión GNU coreutils) probablemente tenga una opción para proporcionar la información.
Keith Thompson

Respuestas:

218

Simplemente navegue al directorio y ejecute el siguiente comando:

du -a --max-depth=1 | sort -n

O agregue -h para tamaños legibles por humanos y -r para imprimir directorios / archivos más grandes primero.

du -a -h --max-depth=1 | sort -hr
Desarrollador
fuente
23
du -hrequiere sort -htambién, para asegurarse de que, digamos 981Mordena antes 1.3G; con sort -nsolo los números se tendrían en cuenta y estarían al revés.
Smylers
Esto no muestra el tamaño de los archivos individuales dentro del directorio actual, solo el tamaño de sus subdirectorios y el tamaño total del directorio actual. ¿Cómo incluiría archivos individuales en la salida también (para responder a la pregunta de OP)?
Erik Trautman
@ErikTrautman para enumerar los archivos también debe agregar -ay usar en --alllugar de --max-depth=1asídu -a -h --all | sort -h
Franco
¡Increíble! He estado haciendo algo tonto durante algunos años. :)
Colby Blair
6
sort -hsolo funciona en la versión de GNU / Linux, no hay suerte con BSD / OS X.
djule5
20

Aparentemente, la --max-depthopción no está en la versión del ducomando de Mac OS X. En su lugar, puede utilizar lo siguiente.

du -h -d 1 | sort -n

cevaris
fuente
Aparentemente, pero no sorprendentemente.
Josh Habdas
20
du -s -- * | sort -n

(esto no mostrará archivos ocultos (.dotfiles))

Úselo du -smpara unidades Mb, etc. Siempre uso

du -smc -- * | sort -n

porque la línea total ( -c) terminará en la parte inferior por razones obvias :)

PD:

  • Ver comentarios para manejar archivos de puntos
  • Utilizo con frecuencia, por ejemplo, 'du -smc / home / / | sort -n | tail 'para tener una idea de dónde se encuentran exactamente las partes grandes
sehe
fuente
5
du --max-depth=1|sort -no find . -mindepth 1 -maxdepth 1|xargs du -s|sort -npor incluir archivos dot también.
Arnaud Le Blanc
@arnoud: Consumo eso también, pero no parecía la adición correcta para esta pregunta (/ respuesta) :)
sehe
@ arnaud576875 find . -mindepth 1 -maxdepth 1 -print0 | xargs -0 du -s | sort -nsi algunas de las rutas encontradas pueden contener espacios.
Lri
1
Esta es una gran variante para obtener una vista legible por humanos del más grande:sudo du -smch * | sort -h | tail
marsbard
16

Mando

du -h --max-depth=0 * | sort -hr

Salida

3,5M    asdf.6000.gz
3,4M    asdf.4000.gz
3,2M    asdf.2000.gz
2,5M    xyz.PT.gz
136K    xyz.6000.gz
116K    xyz.6000p.gz
88K test.4000.gz
76K test.4000p.gz
44K test.2000.gz
8,0K    desc.common.tcl
8,0K    wer.2000p.gz
8,0K    wer.2000.gz
4,0K    ttree.3

Explicación

  • du muestra "uso del disco"
  • h es para "legible por humanos" (tanto en género como en formato)
  • max-depth=0Los medios duno mostrarán los tamaños de las subcarpetas (elimínelo si desea mostrar todos los tamaños de cada archivo en cada sub-, subsub-, ..., carpeta)
  • r es para "reverso" (el archivo más grande primero)

ncdu

Cuando llegué a esta pregunta, quería limpiar mi sistema de archivos. La herramienta de línea de comandos ncduse adapta mejor a esta tarea.

Instalación en Ubuntu:

$ sudo apt-get install ncdu

Uso:

Simplemente escriba ncdu [path]la línea de comando. Después de unos segundos para analizar la ruta, verá algo como esto:

$ ncdu 1.11 ~ Use the arrow keys to navigate, press ? for help
--- / ---------------------------------------------------------
.  96,1 GiB [##########] /home
.  17,7 GiB [#         ] /usr
.   4,5 GiB [          ] /var
    1,1 GiB [          ] /lib
  732,1 MiB [          ] /opt
. 275,6 MiB [          ] /boot
  198,0 MiB [          ] /storage
. 153,5 MiB [          ] /run
.  16,6 MiB [          ] /etc
   13,5 MiB [          ] /bin
   11,3 MiB [          ] /sbin
.   8,8 MiB [          ] /tmp
.   2,2 MiB [          ] /dev
!  16,0 KiB [          ] /lost+found
    8,0 KiB [          ] /media
    8,0 KiB [          ] /snap
    4,0 KiB [          ] /lib64
e   4,0 KiB [          ] /srv
!   4,0 KiB [          ] /root
e   4,0 KiB [          ] /mnt
e   4,0 KiB [          ] /cdrom
.   0,0   B [          ] /proc
.   0,0   B [          ] /sys
@   0,0   B [          ]  initrd.img.old
@   0,0   B [          ]  initrd.img
@   0,0   B [          ]  vmlinuz.old
@   0,0   B [          ]  vmlinuz

Elimina el elemento resaltado actualmente con d, sal con CTRL+c

Martín Thoma
fuente
También puede escribir du -hs * | sort -hr. -s (resumen) es lo mismo que --max-depth = 0
rasmusx
5

ls -Sordena por tamaño. Luego, para mostrar el tamaño también, ls -lSmuestra una pantalla larga ( -l), ordenada por tamaño ( -S). Yo suelo añadir -htambién para facilitar la lectura, así que ls -lhS,.

Thanatos
fuente
1
Ah, lo siento, eso no quedó claro en tu publicación. Quieres du, parece que alguien lo ha publicado. @sehe: Depende de su definición de real: muestra la cantidad de espacio que el directorio está usando para almacenarse. (No se trata simplemente de agregar el tamaño de las subentradas). No es un número aleatorio y no siempre es de 4 KB.
Thanatos
1

Sencillo y rápido:

find . -mindepth 1 -maxdepth 1 -type d | parallel du -s | sort -n

* requiere GNU Parallel .

pje
fuente
0

Creo que podría haber descubierto lo que quieres hacer. Esto le dará una lista ordenada de todos los archivos y todos los directorios, ordenados por tamaño de archivo y tamaño del contenido en los directorios.

(find . -depth 1 -type f -exec ls -s {} \;; find . -depth 1 -type d -exec du -s {} \;) | sort -n
dvorak
fuente
No importa, sehe ha presentado una solución mucho más sencilla. ¡Aprendo algo nuevo cada día!
dvorak
No creo que usar dusea ​​una opción, solo te dará un resultado aproximado.
ztank1013
0

[versión mejorada]
Esto será mucho más rápido y preciso que la versión inicial a continuación y generará la suma de todo el tamaño de archivo del directorio actual:

echo `find . -type f -exec stat -c %s {} \; | tr '\n' '+' | sed 's/+$//g'` | bc

el stat -c %scomando en un archivo devolverá su tamaño en bytes. El trcomando aquí se usa para superar las xargslimitaciones del comando (aparentemente, xargsdividir los resultados en más líneas, rompiendo la lógica de mi comando). Por trlo tanto, se ocupa de reemplazar el avance de línea con el +signo (más). sedtiene el único objetivo de eliminar el último +signo de la cadena resultante para evitar quejas del bccomando final (calculadora básica) que, como de costumbre, hace los cálculos.

Rendimiento: lo probé en varios directorios y más de ~ 150.000 archivos en la parte superior (la cantidad actual de archivos de mi caja de fedora 15) y creo que es un resultado sorprendente:

# time echo `find / -type f -exec stat -c %s {} \; | tr '\n' '+' | sed 's/+$//g'` | bc
12671767700

real    2m19.164s
user    0m2.039s
sys 0m14.850s

En caso de que desee hacer una comparación con el du -sb /comando, generará un uso de disco estimado en bytes ( -bopción)

# du -sb /
12684646920 /

Como esperaba, es un poco más grande que el cálculo de mi comando porque la duutilidad devuelve el espacio asignado de cada archivo y no el espacio consumido real.

[versión inicial]
No puede usar el ducomando si necesita saber el tamaño de la suma exacta de su carpeta porque (según la cita de la página del manual) duestima el uso del espacio de archivos. Por lo tanto, lo llevará a un resultado incorrecto, una aproximación (tal vez cerca del tamaño de la suma, pero probablemente mayor que el tamaño real que está buscando).

Creo que puede haber diferentes formas de responder a tu pregunta, pero esta es la mía:

ls -l $(find . -type f | xargs) | cut -d" " -f5 | xargs | sed 's/\ /+/g'| bc

Encuentra todos los archivos debajo. directorio (cambie. con el directorio que desee), también se incluyen archivos ocultos y (usando xargs) muestra sus nombres en una sola línea, luego produce una lista detallada usando ls -l. Esta salida enorme (a veces) se canaliza hacia el comando de corte y solo -f5se toma el quinto campo ( ), que es el tamaño del archivo en bytes, y se vuelve a canalizar, lo xargsque produce nuevamente una sola línea de tamaños separados por espacios en blanco. Ahora tiene lugar una magia sed que reemplaza cada espacio en blanco con un +signo más ( ) y finalmente bc(calculadora básica) hace los cálculos.

Es posible que necesite ajustes adicionales y es posible que el lscomando se queje de la lista de argumentos demasiado larga.

ztank1013
fuente
si el directorio es demasiado grande, se cuelga durante mucho tiempo, intente trabajar en su directorio de inicio: p
Kit Ho
@KitHo bueno, me temo que no hay una manera fácil y rápida de obtener un resultado preciso sin buscar cada archivo y agregar su tamaño, por lo tanto, la pereza de los comandos depende principalmente de cuántos archivos hay debajo del directorio buscado ... Pero creo que hay es margen de mejoras ... buen desafío!
ztank1013
@KitHo hola, eche un vistazo a la versión mejorada en mi respuesta ... ¡y hágamelo saber, por supuesto!
ztank1013
0

Otra sencilla solución.

$ for entry in $(ls); do du -s "$entry"; done | sort -n

el resultado se verá así

2900    tmp
6781    boot
8428    bin
24932   lib64
34436   sbin
90084   var
106676  etc
125216  lib
3313136 usr
4828700 opt

cambiar "du -s" a "du -sh" mostrará un tamaño legible por humanos, pero no podremos ordenar con este método.

Ambal
fuente
0

puede utilizar lo siguiente para listar archivos por tamaño du -h | sort -hr | más o du -h --max-depth = 0 * | sort -hr | más

Ghassan Shawahneh
fuente
0

Tiendo a usar du de una manera simple.

du -sh */ | sort -n

Esto me da una idea de qué directorios consumen más espacio. Entonces puedo realizar búsquedas más precisas más tarde.

Paso
fuente
Este tipo de trabajo funciona, pero ignora las unidades del tamaño del archivo al ordenar.
Benjamin Engwall