在bash中检查当前分区的可用磁盘空间

时间:2011-11-13 08:37:16

标签: linux bash

我正在用bash编写安装程序。用户将转到目标目录并运行安装脚本,因此第一个操作应该是检查是否有足够的空间。我知道df会报告所有文件系统,但我想知道是否有办法为目标目录所在的分区获取可用空间。

编辑 - 我提出的答案

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

有点奇怪,因为df似乎将其输出格式化为适合终端,所以使用长安装点名称输出向下移动

8 个答案:

答案 0 :(得分:177)

是:

df -k .

用于当前目录。

df -k /some/dir

如果要查看特定目录。

如果你的系统有它,你可能还想查看stat(1)命令。您可以指定输出格式,以便脚本更容易解析。这是一个小例子:

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

答案 1 :(得分:38)

  1. df命令:报告文件系统磁盘空间使用情况
  2. du命令:估计文件空间使用情况
  3. 键入df -hdf -k以列出可用磁盘空间:

     $ df -h
    

    OR

     $ df -k
    

    du显示一个或多个文件或目录正在使用多少空间。

     $ du -sh
    

    -s选项汇总目录正在使用的空间,-h选项提供人类可读输出。

答案 2 :(得分:20)

我认为这应该是ThinkingMedia在这个问题(Check free disk space for current partition in bash)上的答案的评论或编辑,但是我不能发表评论(不够代表),我的编辑被拒绝(原因:“这应该是评论或答案“)。 所以请,SO宇宙的力量,不要因为重复和修复别人的“答案”而该死我。但是互联网上有人错了!™他们不会让我解决它。

代码

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

有一个重大缺陷: 是的,它会将50G免费输出为50 - 但它也会将5.0M免费输出为50或3.4G免费为34或15K免费为15。

要创建一个脚本以检查一定数量的可用磁盘空间,您必须知道要检查的单元。删除它(如上例中sed所做的那样)数字不再有意义了。

如果你真的想让它发挥作用,你必须做类似的事情:

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;

同样对于df -k $INSTALL_TARGET_DIRECTORY的安装人员可能比df -k "$PWD"更有意义。 最后请注意,每个版本的df / linux都没有--output标志。

答案 3 :(得分:2)

可能想要使用它来监视服务器上的挂载点的人的完整示例。此示例将检查/ var / spool是否低于5G并通过电子邮件发送给该人:

  #!/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

答案 4 :(得分:2)

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

以这种方式获得字节大小。

答案 5 :(得分:1)

要知道linux中GB或TB的特定目录的用法,命令是

df -h / dir / inner_dir /

 or

df -sh / dir / inner_dir /

并且知道linux中位的特定目录的用法,命令是

df-k / dir / inner_dir /

答案 6 :(得分:0)

使用字母以人类可读的格式获取当前可用磁盘空间。以下将输出当前分区的可用空间,删除标题和条形字母。

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

50G免费输出50

在bash脚本中使这部分空闲磁盘空间成为可能。

FREE=`df --output=avail -h "$PWD" | sed '1d;s/[^0-9]//g'`
if [[ $FREE -lt 10 ]]; then
         # less than 10GBs free!
fi;

答案 7 :(得分:0)

输入命令shell:

 df -h 

  

df -m

  

df -k

它将显示每个挂载点的可用磁盘空间列表。

您也可以显示/查看单个列。

输入:

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

注意:这里的3是列号。您可以选择所需的列。