¿Cómo obtengo el tamaño de un directorio en la línea de comando?

1065

Traté de obtener el tamaño de un directorio (que contiene directorios y subdirectorios) usando el lscomando con la opción l. Parece que funciona para archivos ( ls -l file name), pero si intento obtener el tamaño de un directorio (por ejemplo, ls -l /home), obtengo solo 4096 bytes, aunque en conjunto es mucho más grande.

Abdul Al Hazred
fuente
18
1) Estrictamente hablando, no puedes. Linux tiene directorios, no carpetas. 2) Hay una diferencia entre el tamaño de un directorio (que es un archivo especial que contiene inodos que apuntan a otros archivos) y el tamaño del contenido de ese directorio. Como otros han señalado, el comando du proporciona este último, que es lo que parece que desea.
jamesqf
11
como parece ser nuevo, solo señalaré la -hopción útil que puede agregar a la -lopción (es decir, ls -lhpara obtener los tamaños de los archivos que se imprimirán en notación amigable para los humanos como 1.1M en lugar de 1130301. La "h "en el du -hscomando que @sam dio como respuesta a su pregunta sobre directorios también significa" legible por humanos ", y también aparece en el df -hque se muestran las cantidades legibles por humanos de espacio libre y utilizado en el disco.
msouth

Respuestas:

1490

du -sh file_path

Explicación

  • duEl comando ( d isc u sage) estima el uso del espacio file_path
  • Las opciones -shson (desde man du):

      -s, --summarize
             display only a total for each argument
    
      -h, --human-readable
             print sizes in human readable format (e.g., 1K 234M 2G)
    

    Para verificar más de un directorio y ver el total, use du -sch:

      -c, --total
             produce a grand total
    
sam
fuente
44
... a menos que tenga
enlaces duros
15
Este es el tipo de respuesta que me encanta <3 Está resumido y es una especie de introducción al comando duy también le da la forma de buscar más detalles man du...
Sugerencia para los fabricantes tipo Unix: la próxima vez, simplemente haga primero el comando "diskusage", o tal vez incluso "uso del disco" ... luego el acceso directo ...;)
jave.web
Funciona muy bien, por find ejemplo, para contar la cantidad de espacio en subdirectorios específicos en la ruta actual: $ find . -type d -name "node_modules" -prune -exec du -sh {} \;
Alex Glukhovtsev
321

Solo usa el ducomando:

du -sh -- *

le dará el uso acumulativo del disco de todos los directorios, archivos, etc. no ocultos en el directorio actual en formato legible por humanos.

Puede usar el dfcomando para conocer el espacio libre en el sistema de archivos que contiene el directorio:

df -h .
Pacifista
fuente
44
du -sh *comienza a arrojar errores de "opción desconocida" si alguno de los archivos en ese directorio comienza con un guión. Más seguro de hacerdu -sh -- *
mpen
1
du -sh *no muestra el uso de memoria de carpetas ocultas
Prashant Prabhakar Singh
44
du -sh -- * .*para incluir archivos de puntos. Esto es útil para incluir un .gitdirectorio posiblemente grande , por ejemplo. Alternativamente, en zsh puede setopt globdotsglob dotfiles por defecto.
cbarrick
1
¿Qué hace el --? Sé que se aplica a las funciones integradas de shell para finalizar los argumentos de opción, pero duno es una función integrada, y no veo este uso documentado para du: linux.die.net/man/1/du
flow2k
A veces querrás agregar -b( --apparent-size)
eleg
196

dues tu amigo. Si solo quieres saber el tamaño total de un directorio, salta a él y ejecuta:

du -hs

¡¿Si también desea saber qué subcarpetas ocupan cuánto espacio en disco ?! Puede extender este comando a:

du -h --max-depth=1 | sort -hr

que le dará el tamaño de todas las subcarpetas (nivel 1). La salida se ordenará (la carpeta más grande en la parte superior).

Chrispie
fuente
Parece que en algunas versiones (¿quizás más antiguas?) De Linux, sort no tiene un interruptor h y, por lo tanto, el siguiente mejor comando que pude encontrar es: du -c --max-depth = 1 | sort -rn
richhallstoke
@richhallstoke si usa ncdulos archivos están ordenados por tamaño descendente de forma predeterminada.
Footfoot
3
+1 para el "| sort -hr"
afranques
67

dupuede ser complicado de usar ya que aparentemente tiene que pasar 100 argumentos para obtener una salida decente. Y descubrir el tamaño de las carpetas ocultas es aún más difícil.

Haz tu vida fácil y útilncdu .

ncdu

Obtiene resúmenes por carpeta que son fácilmente navegables.

Teque5
fuente
99
Esta debería ser la respuesta correcta, al menos para aquellos que pueden instalar software en el sistema. Desafortunadamente, no creo que la mayoría de las personas se desplace hacia abajo lo suficiente como para ver esto.
DavidR
@ RickyNotaro-Garcia No, esto ignora los objetos ocultos y se cuelga en directorios grandes. Es posible que haya una solución correcta con una docena de tuberías, pero ¿por qué desperdiciar su vida?
Teque5
@ RickyNotaro-Garcia Lea todo mi comentario: su intento ignora los objetos ocultos y se cuelga en directorios grandes.
Teque5
2
ncdues genial, siempre busco este comando cuando lo olvido. Es rápido, fácil de navegar y ayuda a encontrar fácilmente carpetas grandes. Para su información, también está disponible para macOS y probablemente para todas las máquinas Linux.
Lukas
..y puede eliminar carpetas directamente ncdupresionando la dtecla
ccpizza
32

Otros lo han mencionado du, pero también me gustaría mencionar Ncdu , que es una versión de ncurses duy proporciona interactividad: puede explorar la jerarquía de directorios directamente y ver los tamaños de los subdirectorios.

Tblue
fuente
26

El ducomando muestra el uso de disco del archivo.

La -hopción muestra resultados en forma legible para humanos (por ejemplo, 4k, 5M, 3G).

du -h (file name)
jackotonye
fuente
22

Todos los ejemplos anteriores le indicarán el tamaño de los datos en el disco (es decir, la cantidad de espacio en disco que utiliza un archivo en particular, que generalmente es mayor que el tamaño real del archivo). Hay algunas situaciones en las que esto no le dará un informe preciso, si los datos no se almacenan realmente en este disco en particular y solo existen referencias de inodo.

En su ejemplo, ha utilizado ls -l en un solo archivo, que habrá devuelto el tamaño real del archivo, NO su tamaño en el disco.

Si desea conocer los tamaños de archivo reales, agregue la opción -b a du.

du -csbh .
Andy Foster
fuente
Si. Estoy usando archivos sdf que comprimen y deducen los archivos, por lo que no pude entender por qué informaba números tan bajos. El tamaño real de los archivos con ls se puede encontrar usando: du -b
Ryan Shillington
15

personalmente creo que esto es lo mejor, si no quieres usar ncdu

# du -sh ./*
ConnerMan
fuente
14
df -h .; du -sh -- * | sort -hr

Esto muestra cuánto espacio en disco le queda en la unidad actual y luego le indica cuánto ocupa cada archivo / directorio. p.ej,

Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb2       206G  167G   29G  86% /
115M    node_modules
2.1M    examples
68K     src
4.0K    webpack.config.js
4.0K    README.md
4.0K    package.json
mpen
fuente
Para su información, parece informar el tamaño en el disco. es decir, probablemente se rellenará al 4KB más cercano.
mpen
9

encuentre todos los archivos en el directorio actual de forma recursiva y resuma su tamaño:

find -type f -print0 | xargs -0 stat --print='%s\n' | awk '{total+=$1} END {print total}'
Leon Chang
fuente
Solía -not -type dsumar no solo los tamaños de los archivos ordinarios ( -type f) sino también los tamaños de los enlaces simbólicos, etc.
anton_rh
Esto es genial, porque no obtienes los gastos generales necesarios para almacenar los archivos, sino solo el tamaño de los propios archivos.
bballdave025
9

Aquí hay una función para sus .bash_aliases

# du with mount exclude and sort
function dusort () {
    DIR=$(echo $1 | sed 's#\/$##')
    du -scxh $(mount | awk '{print $3}' | sort | uniq \
     | sed 's#/# --  exclude=/#') $DIR/* | sort -h
}

salida de muestra:

$ dusort /
...
0       /mnt  
0       /sbin
0       /srv
4,0K    /tmp
728K    /home
23M     /etc
169M    /boot  
528M    /root
1,4G    /usr
3,3G    /var
4,3G    /opt
9,6G    total

para subdirs:

$ dusort .
$ dusort /var/log/
feldversuch
fuente
7

Una variante más:

du -h --max-dep=1
0x8BADF00D
fuente
6

Tenga en cuenta que duimprime el espacio que ocupa un directorio en los medios, que generalmente es más grande que el tamaño total de todos los archivos en el directorio, porque dutiene en cuenta el tamaño de toda la información auxiliar que se almacena en los medios para organizar el directorio de conformidad con formato de sistema de archivos.

Si el sistema de archivos es compresible, dupuede generar un número aún menor que el tamaño total de todos los archivos, ya que los archivos pueden estar comprimidos internamente por el sistema de archivos y, por lo tanto, ocupan menos espacio en los medios que solo la información sin comprimir que contienen. Lo mismo si hay archivos dispersos.

si hay enlaces duros en el directorio, también dupuede imprimir un valor más pequeño porque varios archivos diferentes en el directorio hacen referencia a los mismos datos en los medios.

Para obtener el tamaño total directo de todos los archivos en el directorio, se puede usar la siguiente expresión de shell de una línea (suponiendo un sistema GNU):

find . ! -type d -print0 | xargs -r0 stat -c %s | paste -sd+ - | bc

o incluso más corto:

find . ! -type d -printf '%s\n' | paste -sd+ - | bc

Simplemente suma los tamaños de todos los archivos que no son de directorio en el directorio (y sus subdirectorios de forma recursiva) uno por uno. Tenga en cuenta que para los enlaces simbólicos, informa el tamaño del enlace simbólico (no del archivo al que apunta el enlace simbólico).

anton_rh
fuente
5

Puedes usar

du -sh directory/

y

du -sh filename

para saber el espacio ocupado por la carpeta o archivo.

df -h

mostrará el uso del disco en formato legible para humanos -h hace eso.

También hay un programa basado en GUI llamado Disk Usage Analyzer.

arupgsh
fuente
5

Aquí hay un script POSIX que funcionará con:

  • Un archivo
  • Archivos
  • Un directorio
  • Directorios
#!/bin/sh
ls -ARgo "$@" | awk '{q += $3} END {print q}'

Fuente

Steven Penny
fuente