Vérifier l'espace disque libre pour la partition actuelle dans bash

119

J'écris un installateur en bash. L'utilisateur ira dans le répertoire cible et exécutera le script d'installation, donc la première action devrait être de vérifier qu'il y a suffisamment d'espace. Je sais que df rapportera tous les systèmes de fichiers, mais je me demandais s'il y avait un moyen d'obtenir l'espace libre uniquement pour la partition sur laquelle se trouve le répertoire cible.

Edit - la réponse que j'ai trouvée

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

Légèrement étrange car df semble formater sa sortie pour s'adapter au terminal, donc avec un long nom de point de montage, la sortie est décalée d'une ligne

Greg Reynolds
la source
4
Utilisez le -Pdrapeau pour df, vous obtiendrez tout sur une seule ligne.
Mat
5
lié du -hs .pour voir l'espace disque utilisé pour le répertoire actuel.
ici le
Comme @Mat l'a dit, vous voudrez utiliser -P si vous choisissez votre solution. Dans le passé, j'ai rencontré des partitions au format étrange ou aux noms longs qui ont provoqué l'échec d'un script car l'indicateur -P était manquant.
SuperTetelman

Réponses:

205

Oui:

df -k .

pour le répertoire courant.

df -k /some/dir

si vous souhaitez vérifier un répertoire spécifique.

Vous pouvez également vérifier la stat(1)commande si votre système l'a. Vous pouvez spécifier des formats de sortie pour faciliter l'analyse de votre script. Voici un petit exemple:

$ echo $(($(stat -f --format="%a*%S" .)))
Tapis
la source
Merci pour ça! stat me semble un peu époustouflante. La lecture de la page de manuel suggère que je ne veux pas de -k sur ma version de df, mais mettre le chemin dans a aidé.
Greg Reynolds
Ahh - maintenant je vois pourquoi vous utilisez -k, rend les calculs plus faciles!
Greg Reynolds
1
Le fait est que beaucoup de systèmes utiliseront par défaut des blocs de 512 octets si vous ne le spécifiez pas -k. (coreutils df utilise par défaut 1k blocs, donc vous êtes assez sûr sur Linux - mais si vous avez des coreutils, vous l'avez stat, et c'est encore plus sûr - aucune analyse n'est requise).
Mat
2
Dans mon programme Red-Hat, la chaîne de format devrait être à la %a*%splace de %a*%S. Je ne sais pas s'il s'agit d'une différence ou d'une faute de frappe.
RnMss
@RnMss: Il est censé être %S(capital) selon la page de manuel de RedHat. Impossible de trouver un système de fichiers %s != %Sauquel j'ai accès sur les quelques RedHats, donc je ne peux pas vérifier :-(
Mat
44
  1. df commande: Signaler l'utilisation de l'espace disque du système de fichiers
  2. du commande: Estimer l'utilisation de l'espace fichier

Tapez df -hou df -kpour répertorier l'espace disque disponible:

 $ df -h

OU

 $ df -k

du indique l'espace utilisé par un ou plusieurs fichiers ou répertoires:

 $ du -sh

L' -soption résume l'espace utilisé par un répertoire et l' -hoption fournit une sortie lisible par l' homme .

Girish
la source
24

Je pense que cela devrait être un commentaire ou une modification de la réponse de ThinkingMedia à cette question ( Vérifiez l'espace disque libre pour la partition actuelle dans bash ), mais je ne suis pas autorisé à commenter (pas assez de rep) et ma modification a été rejetée (raison: "cela devrait être un commentaire ou une réponse"). Alors s'il vous plaît, pouvoirs de l'univers SO, ne me damnez pas pour avoir répété et corrigé la "réponse" de quelqu'un d'autre. Mais quelqu'un sur Internet avait tort! ™ et ils ne m'ont pas laissé réparer.

Le code

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

a un défaut substantiel: oui, il sortira 50Ggratuitement en tant que 50 - mais il sera également en sortie 5.0Men tant que 50 ou 3.4Glibre en tant que 34 ou 15Klibre en tant que 15.

Pour créer un script dans le but de vérifier une certaine quantité d'espace disque disponible, vous devez connaître l'unité par rapport à laquelle vous comparez. Supprimez-le (comme seddans l'exemple ci-dessus), les chiffres n'ont plus de sens.

Si vous voulez vraiment que cela fonctionne, vous devrez faire quelque chose comme:

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;

Pour un installateur, cela df -k $INSTALL_TARGET_DIRECTORYpeut aussi avoir plus de sens que df -k "$PWD". Enfin, veuillez noter que l' --outputindicateur n'est pas disponible dans toutes les versions de df / linux.

très
la source
Toutes les distributions ne l'ont pas--output=avail
Yzmir Ramirez
1
Bonne observation. C'est précisément ce que dit la dernière phrase de la réponse. @YzmirRamirez ;-)
très
3
df --output=avail -B 1 "$PWD" |tail -n 1

vous obtenez la taille en octets de cette façon.

xérostome
la source
Toutes les distributions ne l'ont pas--output=avail
Yzmir Ramirez
2

Un exemple complet pour quelqu'un qui pourrait vouloir l'utiliser pour surveiller un point de montage sur un serveur. Cet exemple vérifiera si / var / spool est sous 5G et enverra un e-mail à la personne:

  #!/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
la source
1

Pour connaître l'utilisation du répertoire spécifique dans GB ou TB sous Linux, la commande est,

df -h / dir / rép_interne /

 or

df -sh / dir / rép_interne /

et pour connaître l'utilisation du répertoire spécifique en bits sous linux, la commande est,

df-k / dir / rép_interne /

ganesh hegde
la source
0

Tapez le shell de commande:

 df -h 

ou

df -m

ou

df -k

Il affichera la liste des espaces disque libres pour chaque point de montage.

Vous pouvez également afficher / afficher une seule colonne.

Type:

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

Remarque: Ici, 3 est le numéro de colonne. Vous pouvez choisir la colonne dont vous avez besoin.

Masud Sarker
la source