Verifique o tamanho da pasta no Bash


317

Estou tentando escrever um script que calcule o tamanho de um diretório e, se o tamanho for menor que 10 GB e maior que 2 GB, faça alguma ação. Onde preciso mencionar o nome da minha pasta?

# 10GB
SIZE="1074747474"

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

1
E se você quiser classificá-lo: serverfault.com/questions/62411/…
cregox 19/11/2015


Como esta é uma pergunta popular - Se algum iniciante está encontrando as respostas sobre essa pergunta e quer aprender mais sobre o que diabos dué e como todos conhecem todos esses comandos: Você pode digitar man duseu terminal para pesquisar o comando du no manual. Isso exibirá uma saída que você pode visualizar e resumirá todos os sinalizadores como -h, -c, -s, -b, -B, --apparent-size, etc. que respondam às sugestões que você está usando. Em seguida, você pode decidir por si mesmo como deseja usar melhor dupara seu caso de uso específico.
Josh Desmond

Respostas:


610

Você pode fazer:

du -h your_directory

que lhe dará o tamanho do seu diretório de destino.

Se você quer uma saída breve, du -hcs your_directoryé bom.


15
Você não deseja números legíveis por humanos quando estiver tentando obter um valor para um script.
arroz

4
Sem nenhum caminho de diretório especificado, o padrão será o diretório de trabalho atual. então du -hs== du -hs ..
Razz

8
Verifique também: du | sort -nele classificará os diretórios por tamanho
optimiertes

3
du -hcs dir_name/*inclui as subpastas
optimiertes

du -h <dir> | cauda -1?
Alexander Mills

143

se você quiser apenas ver o tamanho da pasta e não as subpastas, poderá usar:

du -hs /path/to/directory

Atualizar:

Você deve saber que dumostra o espaço em disco usado; e não o tamanho do arquivo.

Você pode usar --apparent-sizese quiser ver a soma dos tamanhos reais de arquivo.

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

E é claro que não há necessidade da opção -h(legível por humanos) dentro de um script.

Em vez disso, você pode usar -bpara facilitar a comparação dentro do script.

Mas você deve observar que isso -bse aplica --apparent-sizepor si só. E pode não ser o que você precisa.

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

então eu acho que você deveria usar --block-sizeou-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

Eu sei que já faz alguns anos, mas você poderia explicar um pouco qual é o objetivo de regex e BASH_REMATCH nos condicionais? (ou para fornecer alguns links sobre o uso dessas variáveis ​​/ comandos / formatos) Eu esperava que o código obtivesse o tamanho do arquivo em uma variável e comparasse diretamente com 10 gb, o que essas outras coisas estão fazendo?
Nordico 20/05

2
@Nordico yup. não havia necessidade de regex e BASH_REMATCH, por isso atualizei a resposta.
Taxellool

29

Use um resumo ( -s) e bytes ( -b). Você pode cortar o primeiro campo do resumo com cut. Juntando tudo:

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

1
Eu sou novo no shell script. A saída do comando du incluiu o nome do diretório. Não consegui obter apenas parte do número. "cortar" na sua resposta resolveu o mistério!
Simples # Dev

26

Para obter apenas o tamanho do diretório, nada mais:

du --max-depth=0 ./directory

saída parece

5234232       ./directory

5
--max-depthé muito útil para controlar utilmente a saída! por exemplo, para ter uma boa noção do que está acontecendo dentro de um diretório:du -h --max-depth=1
matanster


12

se você quiser apenas ver o tamanho agregado da pasta e provavelmente no formato MB ou GB, tente o script abaixo

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

1
no os x, os sinalizadores são -gpara -mcontagens de 1 Gbyte e 1 Mbyte. viaman 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

Se ajudar, você também pode criar um alias no seu .bashrcou .bash_profile.

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

Isso imprime o tamanho do diretório atual ou do diretório que você passou como argumento.


Esta é uma ótima resposta
d8aninja:
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.