Controlla lo spazio libero su disco per la partizione corrente in bash


119

Sto scrivendo un programma di installazione in bash. L'utente andrà alla directory di destinazione ed eseguirà lo script di installazione, quindi la prima azione dovrebbe essere quella di verificare che ci sia spazio sufficiente. So che df riporterà tutti i file system, ma mi chiedevo se ci fosse un modo per ottenere lo spazio libero solo per la partizione in cui si trova la directory di destinazione.

Modifica: la risposta che ho trovato

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

Un po 'strano perché df sembra formattare il suo output per adattarlo al terminale, quindi con un nome lungo del punto di montaggio l'output viene spostato su una riga


4
Usa la -Pbandiera per df, otterrai tutto su una riga.
Sabato

5
relativo du -hs .alla visualizzazione dello spazio su disco in uso per la directory corrente.
qui l'

Come ha detto @Mat, vorrai usare -P se vai con la tua soluzione. In passato ho riscontrato partizioni stranamente formattate o con nomi lunghi che hanno causato il fallimento di uno script perché mancava il flag -P.
SuperTetelman

Risposte:


205

Sì:

df -k .

per la directory corrente.

df -k /some/dir

se vuoi controllare una directory specifica.

Potresti anche voler controllare il stat(1)comando se il tuo sistema lo ha. È possibile specificare i formati di output per semplificare l'analisi dello script. Ecco un piccolo esempio:

$ echo $(($(stat -f --format="%a*%S" .)))

Grazie per quello! stat sembra un po 'strabiliante per me. Leggere la pagina man suggerisce che non voglio -k sulla mia versione di df, ma l'inserimento del percorso è stato d'aiuto.
Greg Reynolds

Ahh - ora capisco perché usi -k, semplifica i calcoli!
Greg Reynolds

1
Il fatto è che molti sistemi imposteranno per impostazione predefinita blocchi da 512 byte se non si specifica -k. (Il valore predefinito di coreutils df è 1k blocchi, quindi sei abbastanza sicuro su Linux, ma se hai coreutils, lo hai stat, e questo è ancora più sicuro - non è richiesta alcuna analisi).
Sabato

2
Nel mio Red-Hat qualcosa, la stringa di formato dovrebbe essere %a*%sinvece di %a*%S. Non sono sicuro se questa sia una differenza o un errore di battitura.
RnMss

@RnMss: dovrebbe essere %S(maiuscolo) secondo la pagina man su RedHat. Non riesco a trovare un filesystem a cui %s != %Sanche io ho accesso sui pochi RedHats, quindi non posso controllare :-(
Mat

44
  1. df comando: segnala l'utilizzo dello spazio su disco del file system
  2. du comando: stima l'utilizzo dello spazio per i file

Digita df -ho df -kper elencare lo spazio libero su disco:

 $ df -h

O

 $ df -k

du mostra quanto spazio sta utilizzando uno o più file o directory:

 $ du -sh

L' -sopzione riepiloga lo spazio utilizzato da una directory e -hfornisce un output leggibile dall'uomo .


24

Penso che questo dovrebbe essere un commento o una modifica alla risposta di ThinkingMedia su questa stessa domanda ( controlla lo spazio libero su disco per la partizione corrente in bash ), ma non sono autorizzato a commentare (non abbastanza rep) e la mia modifica è stata rifiutata (motivo: "questo dovrebbe essere un commento o una risposta"). Quindi per favore, poteri dell'universo SO, non accidenti a me per aver ripetuto e corretto la "risposta" di qualcun altro. Ma qualcuno su Internet si era sbagliato! ™ e non mi hanno permesso di aggiustarlo.

Il codice

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

ha un difetto sostanziale: Sì, verrà prodotto 50Ggratuitamente come 50, ma sarà anche 5.0Mlibero come 50 o 3.4Glibero come 34 o 15Klibero come 15.

Per creare uno script con lo scopo di verificare la presenza di una certa quantità di spazio libero su disco, è necessario conoscere l'unità su cui si sta verificando. Rimuovilo (comesed nell'esempio sopra) i numeri non hanno più senso.

Se vuoi davvero che funzioni, dovrai fare qualcosa come:

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;

Anche per un programma di installazione df -k $INSTALL_TARGET_DIRECTORYpotrebbe avere più senso di df -k "$PWD". Infine, tieni presente che il --outputflag non è disponibile in tutte le versioni di df / linux.


Non tutte le distribuzioni hanno--output=avail
Yzmir Ramirez

1
Buona osservazione. Questo è esattamente ciò che afferma l'ultima frase della risposta. @YzmirRamirez ;-)
trs

3
df --output=avail -B 1 "$PWD" |tail -n 1

in questo modo ottieni le dimensioni in byte.


Non tutte le distribuzioni hanno--output=avail
Yzmir Ramirez

2

Un esempio completo per qualcuno che potrebbe volerlo utilizzare per monitorare un punto di montaggio su un server. Questo esempio controllerà se / var / spool è inferiore a 5G e invierà un'email alla persona:

  #!/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="dude@wheres.mycar"
  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

1

Per conoscere l'utilizzo della directory specifica in GB o TB in Linux il comando è,

df -h / dir / dir_interna /

 or

df -sh / dir / dir_interna /

e per conoscere l'utilizzo della directory specifica in bit in linux il comando è,

df-k / dir / dir_interna /


0

Digita nella shell dei comandi:

 df -h 

o

df -m

o

df -k

Mostrerà l'elenco degli spazi liberi su disco per ogni punto di montaggio.

Puoi anche mostrare / visualizzare una singola colonna.

Genere:

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

Nota: qui 3 è il numero della colonna. Puoi scegliere quale colonna ti serve.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.