Überprüfen Sie den freien Speicherplatz für die aktuelle Partition in Bash

118

Ich schreibe einen Installer in Bash. Der Benutzer wechselt in das Zielverzeichnis und führt das Installationsskript aus. Die erste Aktion sollte daher darin bestehen, zu überprüfen, ob genügend Speicherplatz vorhanden ist. Ich weiß, dass df alle Dateisysteme melden wird, aber ich habe mich gefragt, ob es eine Möglichkeit gibt, den freien Speicherplatz nur für die Partition zu erhalten, auf der sich das Zielverzeichnis befindet.

Bearbeiten - die Antwort, die ich mir ausgedacht habe

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

Etwas seltsam, da df seine Ausgabe so zu formatieren scheint, dass sie zum Terminal passt. Bei einem langen Einhängepunktnamen wird die Ausgabe also um eine Linie verschoben

Greg Reynolds
quelle
4
Verwenden Sie die -PFlagge df, um alles in einer Zeile zu erhalten.
Mat
5
im Zusammenhang du -hs .mit dem Speicherplatz, der für das aktuelle Verzeichnis verwendet wird.
hier
Wie @Mat sagte, möchten Sie -P verwenden, wenn Sie mit Ihrer Lösung gehen. In der Vergangenheit bin ich auf seltsam formatierte oder lange benannte Partitionen gestoßen, die dazu führten, dass ein Skript fehlschlug, weil das -P-Flag fehlte.
SuperTetelman

Antworten:

204

Ja:

df -k .

für das aktuelle Verzeichnis.

df -k /some/dir

Wenn Sie ein bestimmtes Verzeichnis überprüfen möchten.

Möglicherweise möchten Sie den stat(1)Befehl auch überprüfen, wenn Ihr System über ihn verfügt. Sie können Ausgabeformate angeben, um das Parsen Ihres Skripts zu vereinfachen. Hier ist ein kleines Beispiel:

$ echo $(($(stat -f --format="%a*%S" .)))
Matte
quelle
Dank dafür! stat sieht für mich ein bisschen umwerfend aus. Das Lesen der Manpage legt nahe, dass ich -k für meine Version von df nicht möchte, aber das Einfügen des Pfads hat geholfen.
Greg Reynolds
Ahh - jetzt verstehe ich, warum Sie -k verwenden, erleichtert die Berechnungen!
Greg Reynolds
1
Die Sache ist, dass viele Systeme standardmäßig 512-Byte-Blöcke verwenden, wenn Sie dies nicht angeben -k. (coreutils df ist standardmäßig auf 1k-Blöcke eingestellt, sodass Sie unter Linux zwar ziemlich sicher sind - aber wenn Sie coreutils haben stat, haben Sie das , und das ist noch sicherer - kein Parsen erforderlich).
Mat
2
In meinem Red-Hat-Format sollte die Formatzeichenfolge %a*%sanstelle von sein %a*%S. Ich bin mir nicht sicher, ob dies ein Unterschied oder ein Tippfehler ist.
RnMss
@RnMss: Es sollte sein %S(Kapital) nach der Manpage auf RedHat. Ich kann kein Dateisystem finden, %s != %Sauf das ich auf den wenigen RedHats auch Zugriff habe, kann also nicht überprüfen :-(
Mat
43
  1. df Befehl: Speicherplatzbelegung des Dateisystems melden
  2. du Befehl: Schätzen Sie den Speicherplatzbedarf

Geben Sie df -hoder ein, df -kum freien Speicherplatz aufzulisten:

 $ df -h

ODER

 $ df -k

du zeigt an, wie viel Speicherplatz eine oder mehrere Dateien oder Verzeichnisse belegen:

 $ du -sh

Die -sOption fasst den von einem Verzeichnis verwendeten Speicherplatz zusammen und -hbietet eine für Menschen lesbare Ausgabe.

Girish
quelle
24

Ich denke, dies sollte ein Kommentar oder eine Änderung der Antwort von ThinkingMedia auf genau diese Frage sein ( Überprüfen Sie den freien Speicherplatz für die aktuelle Partition in Bash ), aber ich darf keine Kommentare abgeben (nicht genügend Wiederholungen) und meine Bearbeitung wurde abgelehnt (Grund: "Dies sollte ein Kommentar oder eine Antwort sein"). Also bitte, Kräfte des SO-Universums, verdammt mich nicht dafür, dass ich die "Antwort" eines anderen wiederhole und korrigiere. Aber jemand im Internet hat sich geirrt! ™ und sie ließen mich das nicht reparieren.

Der Code

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

hat einen wesentlichen Fehler: Ja, es wird 50Gkostenlos als 50 ausgegeben - aber es wird auch 5.0Mkostenlos als 50 oder 3.4Gkostenlos als 34 oder ausgegeben15K kostenlos als 15 .

Um ein Skript zu erstellen, mit dem nach einer bestimmten Menge an freiem Speicherplatz gesucht werden soll, müssen Sie die Einheit kennen, gegen die Sie prüfen. Entfernen Sie es (wie sedim obigen Beispiel). Die Zahlen machen keinen Sinn mehr.

Wenn Sie tatsächlich möchten, dass es funktioniert, müssen Sie Folgendes tun:

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;

Auch für einen Installer df -k $INSTALL_TARGET_DIRECTORYkönnte dies sinnvoller sein als df -k "$PWD". Beachten Sie schließlich, dass das --outputFlag nicht in jeder Version von df / linux verfügbar ist.

trs
quelle
Nicht alle Distributionen haben--output=avail
Yzmir Ramirez
1
Gute Beobachtung. Genau das sagt der letzte Satz der Antwort. @YzmirRamirez ;-)
trs
3
df --output=avail -B 1 "$PWD" |tail -n 1

Auf diese Weise erhalten Sie die Größe in Bytes.

Xerostomus
quelle
Nicht alle Distributionen haben--output=avail
Yzmir Ramirez
2

Ein vollständiges Beispiel für jemanden, der damit einen Mountpunkt auf einem Server überwachen möchte. In diesem Beispiel wird überprüft, ob / var / spool unter 5G liegt, und der Person eine E-Mail gesendet:

  #!/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.
quelle
1

Um die Verwendung des spezifischen Verzeichnisses in GB oder TB unter Linux zu kennen, lautet der Befehl:

df -h / dir / inner_dir /

 or

df -sh / dir / inner_dir /

und um die Verwendung des spezifischen Verzeichnisses in Bits unter Linux zu kennen, lautet der Befehl:

df-k / dir / inner_dir /

Ganesh Hegde
quelle
0

Geben Sie die Befehlsshell ein:

 df -h 

oder

df -m

oder

df -k

Es wird die Liste der freien Speicherplätze für jeden Einhängepunkt angezeigt.

Sie können auch eine einzelne Spalte anzeigen / anzeigen.

Art:

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

Hinweis: Hier ist 3 die Spaltennummer. Sie können auswählen, welche Spalte Sie benötigen.

Masud Sarker
quelle