Verifique o espaço livre em disco para a partição atual no bash

118

Estou escrevendo um instalador em bash. O usuário irá para o diretório de destino e executará o script de instalação, portanto, a primeira ação deve ser verificar se há espaço suficiente. Sei que o df relatará todos os sistemas de arquivos, mas gostaria de saber se há uma maneira de obter o espaço livre apenas para a partição em que o diretório de destino está.

Editar - a resposta que eu dei

df $PWD | awk '/[0-9]%/{print $(NF-2)}'

Um pouco estranho porque df parece formatar sua saída para caber no terminal, então, com um nome de ponto de montagem longo, a saída é deslocada para baixo em uma linha

Greg Reynolds
fonte
4
Use a -Pbandeira para dfobter tudo em uma linha.
Mat
5
relacionado du -hs .para ver o espaço em disco em uso para o diretório atual.
aqui
Como @Mat disse, você vai querer usar -P se for com sua solução. No passado, encontrei partições com formatação estranha ou com nomes longos que faziam com que um script falhasse porque o sinalizador -P estava ausente.
SuperTetelman

Respostas:

204

Sim:

df -k .

para o diretório atual.

df -k /some/dir

se você deseja verificar um diretório específico.

Você também pode verificar o stat(1)comando, se o seu sistema o tiver. Você pode especificar formatos de saída para facilitar a análise do seu script. Aqui está um pequeno exemplo:

$ echo $(($(stat -f --format="%a*%S" .)))
Esteira
fonte
Obrigado por isso! stat parece um pouco alucinante para mim. Ler a página do manual sugere que não quero -k em minha versão do df, mas colocar o caminho ajudou.
Greg Reynolds
Ahh - agora eu vejo porque você usa -k, torna os cálculos mais fáceis!
Greg Reynolds
1
O fato é que muitos sistemas irão usar blocos de 512 bytes por padrão se você não especificar -k. (coreutils df padroniza para blocos de 1k, então você está bastante seguro no Linux - mas se você tem coreutils, você tem stat, e isso é ainda mais seguro - nenhuma análise necessária).
Mat
2
Em meu algo Red-Hat, a string de formato deve ser em %a*%svez de %a*%S. Não tenho certeza se isso é uma diferença ou um erro de digitação.
RnMss
@RnMss: É suposto ser %S(maiúsculo) de acordo com a página de manual do RedHat. Não consigo encontrar um sistema de arquivos %s != %Snos poucos RedHats que tenho acesso, portanto, não posso verificar :-(
Mat
43
  1. df comando: relatar o uso de espaço em disco do sistema de arquivos
  2. du comando: Estimar o uso do espaço no arquivo

Digite df -hou df -kpara listar o espaço livre em disco:

 $ df -h

OU

 $ df -k

du mostra quanto espaço um ou mais arquivos ou diretórios estão usando:

 $ du -sh

A -sopção resume o espaço que um diretório está usando e a -hopção fornece saída legível por humanos .

Feminino
fonte
24

Eu acho que isso deveria ser um comentário ou uma edição para a resposta da ThinkingMedia sobre esta questão ( verifique o espaço livre em disco para a partição atual no bash ), mas eu não tenho permissão para comentar (não tenho repetições suficientes) e minha edição foi rejeitada (motivo: "deve ser um comentário ou uma resposta"). Então, por favor, poderes do universo SO, não me condenem por repetir e consertar a "resposta" de outra pessoa. Mas alguém na internet errou! ™ e não me deixou consertar.

O código

  df --output=avail -h "$PWD" | sed '1d;s/[^0-9]//g'

tem uma falha substancial: Sim, a saída será 50Ggratuita como 50 - mas também será impressa 5.0Mcomo gratuita como 50 ou 3.4Gcomo 34 ou 15Kcomo 15.

Para criar um script com o propósito de verificar uma certa quantidade de espaço livre em disco, você precisa saber a unidade que está verificando. Remova-o (como sedno exemplo acima) os números não fazem mais sentido.

Se você realmente deseja que funcione, terá que fazer algo como:

FREE=`df -k --output=avail "$PWD" | tail -n1`   # df -k not df -h
if [[ $FREE -lt 10485760 ]]; then               # 10G = 10*1024*1024k
     # less than 10GBs free!
fi;

Além disso, para um instalador, df -k $INSTALL_TARGET_DIRECTORYpode fazer mais sentido do que df -k "$PWD". Finalmente, observe que o --outputsinalizador não está disponível em todas as versões do df / linux.

trs
fonte
Nem todas as distros o fizeram--output=avail
Yzmir Ramirez
1
Boa observação. Isso é precisamente o que afirma a última frase da resposta. @YzmirRamirez ;-)
trs
3
df --output=avail -B 1 "$PWD" |tail -n 1

você obtém o tamanho em bytes desta forma.

xerostomus
fonte
Nem todas as distros o fizeram--output=avail
Yzmir Ramirez
2

Um exemplo completo para alguém que pode querer usar isso para monitorar um ponto de montagem em um servidor. Este exemplo verificará se / var / spool está abaixo de 5G e enviará um e-mail para a pessoa:

  #!/bin/bash
  # -----------------------------------------------------------------------------------------
  # SUMMARY: Check if MOUNT is under certain quota, mail us if this is the case
  # DETAILS: If under 5G we have it alert us via email. blah blah  
  # -----------------------------------------------------------------------------------------
  # CRON: 0 0,4,8,12,16 * * * /var/www/httpd-config/server_scripts/clear_root_spool_log.bash

  MOUNTP=/var/spool  # mount drive to check
  LIMITSIZE=5485760 # 5G = 10*1024*1024k   # limit size in GB   (FLOOR QUOTA)
  FREE=$(df -k --output=avail "$MOUNTP" | tail -n1) # df -k not df -h
  LOG=/tmp/log-$(basename ${0}).log
  MAILCMD=mail
  EMAILIDS="[email protected]"
  MAILMESSAGE=/tmp/tmp-$(basename ${0})

  # -----------------------------------------------------------------------------------------

  function email_on_failure(){

          sMess="$1"
          echo "" >$MAILMESSAGE
          echo "Hostname: $(hostname)" >>$MAILMESSAGE
          echo "Date & Time: $(date)" >>$MAILMESSAGE

          # Email letter formation here:
          echo -e "\n[ $(date +%Y%m%d_%H%M%S%Z) ] Current Status:\n\n" >>$MAILMESSAGE
          cat $sMess >>$MAILMESSAGE

          echo "" >>$MAILMESSAGE
          echo "*** This email generated by $(basename $0) shell script ***" >>$MAILMESSAGE
          echo "*** Please don't reply this email, this is just notification email ***" >>$MAILMESSAGE

          # sending email (need to have an email client set up or sendmail)
          $MAILCMD -s "Urgent MAIL Alert For $(hostname) AWS Server" "$EMAILIDS" < $MAILMESSAGE

          [[ -f $MAILMESSAGE ]] && rm -f $MAILMESSAGE

  }

  # -----------------------------------------------------------------------------------------

  if [[ $FREE -lt $LIMITSIZE ]]; then
          echo "Writing to $LOG"
          echo "MAIL ERROR: Less than $((($FREE/1000))) MB free (QUOTA) on $MOUNTP!" | tee ${LOG}
          echo -e "\nPotential Files To Delete:" | tee -a ${LOG}
          find $MOUNTP -xdev -type f -size +500M -exec du -sh {} ';' | sort -rh | head -n20 | tee -a ${LOG}
          email_on_failure ${LOG}
  else
          echo "Currently $(((($FREE-$LIMITSIZE)/1000))) MB of QUOTA available of on $MOUNTP. "
  fi
Mike Q
fonte
1

Para saber o uso do diretório específico em GB ou TB no Linux, o comando é,

df -h / dir / inner_dir /

 or

df -sh / dir / inner_dir /

e para saber o uso do diretório específico em bits no linux o comando é,

df-k / dir / inner_dir /

ganesh hegde
fonte
0

Digite no shell de comando:

 df -h 

ou

df -m

ou

df -k

Ele mostrará a lista de espaços livres em disco para cada ponto de montagem.

Você também pode mostrar / visualizar uma única coluna.

Tipo:

df -m |awk '{print $3}'

Nota: aqui, 3 é o número da coluna. Você pode escolher qual coluna você precisa.

Masud Sarker
fonte