Verifique el tamaño de la carpeta en Bash


317

Estoy tratando de escribir una secuencia de comandos que calcule un tamaño de directorio y si el tamaño es menor a 10 GB y mayor a 2 GB, realice alguna acción. ¿Dónde debo mencionar el nombre de mi carpeta?

# 10GB
SIZE="1074747474"

# check the current size
CHECK="`du /data/sflow_log/`"
if [ "$CHECK" -gt "$SIZE" ]; then
  echo "DONE"
fi

1
Y si desea ordenarlo: serverfault.com/questions/62411/…
cregox


Dado que esta es una pregunta popular: si algún principiante encuentra las respuestas a esta pregunta y quiere aprender más sobre qué diablos dues y cómo todos conocen todos estos comandos: puede escribir man dusu terminal para buscar el comando du en el manual. Esto mostrará una salida que puede ver, y resumirá todos los indicadores como -h, -c, -s, -b, -B, --apparent-size, etc. que las respuestas sugiere que utilice. Luego, puede decidir por sí mismo cuál es la mejor manera de usarla dupara su caso de uso específico.
Josh Desmond

Respuestas:


610

Tu puedes hacer:

du -h your_directory

que le dará el tamaño de su directorio de destino.

Si quieres una salida breve, du -hcs your_directoryes agradable.


15
No desea números legibles por humanos cuando intenta obtener un valor para un script.
arroz

44
Sin una ruta de directorio especificada, el directorio de trabajo actual será predeterminado. entonces du -hs== du -hs ..
razz

8
También echa un vistazo: du | sort -nordenará los directorios por su tamaño
optimiertes

3
du -hcs dir_name/*incluye las subcarpetas
optimiertes

du -h <dir> | cola -1?
Alexander Mills el

143

si solo desea ver el tamaño de la carpeta y no las subcarpetas, puede usar:

du -hs /path/to/directory

Actualizar:

Deberías saber eso du muestra el espacio en disco utilizado; y no el tamaño del archivo.

Puede usarlo --apparent-sizesi desea ver la suma de los tamaños de archivo reales.

--apparent-size
      print  apparent  sizes,  rather  than  disk  usage; although the apparent size is usually smaller, it may be larger due to holes in ('sparse')
      files, internal fragmentation, indirect blocks, and the like

Y, por supuesto, no hay necesidad de -huna opción (legible para humanos) dentro de un script.

En su lugar, puede usar -bpara una comparación más fácil dentro del script.

Pero debe tener en cuenta que se -baplica --apparent-sizepor sí mismo. Y puede que no sea lo que necesitas.

-b, --bytes
      equivalent to '--apparent-size --block-size=1'

así que creo que deberías usar --block-sizeo-B

#!/bin/bash
SIZE=$(du -B 1 /path/to/directory | cut -f 1 -d "   ")    
# 2GB = 2147483648 bytes
# 10GB = 10737418240 bytes
if [[ $SIZE -gt 2147483648 && $SIZE -lt 10737418240 ]]; then
    echo 'Condition returned True'
fi

Sé que han pasado un par de años, pero ¿sería tan amable de explicar un poco cuál es el propósito de la expresión regular y BASH_REMATCH en los condicionales? (o para proporcionar algunos enlaces sobre el uso de esas variables / comandos / formatos) Hubiera esperado que el código solo obtuviera el tamaño del archivo en una variable y lo comparara con 10 gb directamente, ¿qué están haciendo esas otras cosas?
Nordico

2
@Nordico sí. no había necesidad de expresiones regulares y BASH_REMATCH, así que actualicé la respuesta.
Taxellool

29

Use un resumen ( -s) y bytes ( -b). Puede cortar el primer campo del resumen con cut. Poniendolo todo junto:

CHECK=$(du -sb /data/sflow_log | cut -f1)

1
Soy nuevo en los scripts de shell. Salida del comando du incluido el nombre del directorio. No pude obtener solo la parte del número. "cortar" en tu respuesta resolvió el misterio!
simpleDev

26

Para obtener el tamaño del directorio, nada más:

du --max-depth=0 ./directory

la salida se ve como

5234232       ./directory

55
--max-depth¡es muy útil para controlar la salida de manera útil! por ejemplo, para tener una buena idea de lo que sucede dentro de un directorio:du -h --max-depth=1
matanster


12

si solo desea ver el tamaño agregado de la carpeta y probablemente en formato MB o GB, pruebe el siguiente script

$du -s --block-size=M /path/to/your/directory/

1
en os x, las banderas son -gpara -mconteos de 1 Gbyte y 1 Mbyte. víaman du
Sgnl

5
# 10GB
SIZE="10"


# check the current size
CHECK="`du -hs /media/662499e1-b699-19ad-57b3-acb127aa5a2b/Aufnahmen`"
CHECK=${CHECK%G*}
echo "Current Foldersize: $CHECK GB"

if (( $(echo "$CHECK > $SIZE" |bc -l) )); then
        echo "Folder is bigger than $SIZE GB"
else
        echo "Folder is smaller than $SIZE GB"
fi

4

Si ayuda, también puede crear un alias en su .bashrco .bash_profile.

function dsize()
{
    dir=$(pwd)
    if [ "$1" != "" ]; then
            dir=$1
    fi
    echo $(du -hs $dir)
}

Esto imprime el tamaño del directorio actual o el directorio que ha pasado como argumento.


Esta es una gran respuesta
d8aninja
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.