¿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?


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

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


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

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


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,.


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 .


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

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.


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.


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


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.


Este tipo de trabajo funciona, pero ignora las unidades del tamaño del archivo al ordenar.
Benjamin Engwall
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.