Como calcular o espaço total em disco usando df?

1

Como modifico o comando df -h para adicionar os resultados do seguinte comando (em outras palavras, adicione-os todos juntos e retorne o resultado)?

$ df -h | awk '{print $2}'
Size
5.8G
64G
93M
3.9G
12G
108G
16G
134G
3.7T
3.7T
6.0T
    
por tester787 15.02.2018 / 23:52

3 respostas

2

A formatação legível dos números fica no caminho, então você precisa ter saída consistente primeiro. Portavelmente, você pode usar a opção -P para produzir em blocos de 1024

df -P | awk 'NR>2{sum+=$2}END{print sum}'

Se você usa o GNU df , pode especificar a opção --blocksize :

df --block-size=1  | awk 'NR>2{sum+=$2}END{print sum}'

NR>2 portion é para evitar lidar com a linha de cabeçalho Size . Quanto à formatação de dados de volta para o formato legível, se você estiver no Linux, você pode usar a ferramenta numfmt , caso contrário - implemente o conversor em awk . Veja a resposta relacionada .

Observe também que df produz tamanhos para todos os sistemas de arquivos, incluindo sistemas de arquivos virtuais, como udev e tmpfs . Você pode considerar filtrá-los se quiser apenas os discos físicos reais. Então, se considerarmos apenas sistemas de arquivos que possuem um arquivo de dispositivo representado em /dev/ filesystem, você provavelmente poderia usar algo assim:

df -P | awk 'NR>2 && /^\/dev\//{sum+=$2}END{print sum}'

Com o GNU df , você pode considerar também usar --local flag para ignorar a remoção de sistemas de arquivos.

    
por 16.02.2018 / 00:01
1

O GNU df pode fazer o somatório sozinho, e versões recentes (pelo menos desde 8.21, não tenho certeza sobre versões mais antigas) permitem que você selecione os campos para a saída, então:

$ df -h --output=size --total
 Size
 971M
 200M
  18G
 997M
 5.0M
 997M
  82M
  84M
  84M
 200M
  22G
$ df -h --output=size --total | awk 'END {print $1}'
22G

Em man df :

--output[=FIELD_LIST]
      use the output format defined by FIELD_LIST, or print all fields
      if FIELD_LIST is omitted.
--total
      elide  all entries insignificant to available space, and produce
      a grand total
    
por 16.02.2018 / 10:42
-1
df  | awk -va=0  '{a=a+$2} END {print "Total:",a, "or "((a/1000000)),"GB"}'
    
por 16.02.2018 / 04:09