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


118

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

编辑-我想出的答案

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

有点奇怪,因为df似乎会格式化其输出以适合终端,因此对于长安装点名称,输出将下移一行


4
使用将-P标记为df,您将全部获得一行。

5
有关du -hs .查看当前目录使用的磁盘空间。
这里

就像@Mat所说的,如果使用您的解决方案,您将要使用-P。过去,我遇到过格式奇怪或名称较长的分区,这些分区导致脚本失败,因为缺少-P标志。
SuperTetelman

Answers:


204

是:

df -k .

用于当前目录。

df -k /some/dir

如果要检查特定目录。

您可能还想签出该stat(1)命令(如果您的系统具有该 命令)。您可以指定输出格式,以使脚本更易于解析。这是一个小例子:

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

感谢那!stat对我来说有点令人激动。阅读手册页建议我不要在我的df版本中使用-k,但是将路径放入确实有所帮助。
格雷格·雷诺兹

啊-现在,我明白了为什么使用-k了,这使计算更容易!
格雷格·雷诺兹

1
问题是,如果您未指定,很多系统将默认使用512字节块-k。(coreutils df默认为1k块,因此尽管在Linux上您还是很安全的-但是,如果您有coreutils,则有了stat,这甚至更安全-无需解析)。

2
在我的Red Hat中,格式字符串应%a*%s改为%a*%S。我不确定这是区别还是错别字。
RnMss 2013年

@RnMss:根据RedHat的手册页,应该%S(大写)。找不到%s != %S在我也可以访问的几个RedHat上的文件系统,因此无法检查:-(
Mat

43
  1. df 命令:报告文件系统磁盘空间使用情况
  2. du 命令:估计文件空间使用率

输入df -hdf -k列出可用磁盘空间:

 $ df -h

要么

 $ df -k

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

 $ du -sh

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


24

我认为这应该是对这个问题(在bash中检查当前分区的可用磁盘空间)的评论或对ThinkingMedia答案的编辑,但是我不允许发表评论(没有足够的代表),并且我的编辑被拒绝(原因: “这应该是评论或答案”)。所以,请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"。最后,请注意,该--output标志并非在df / linux的每个版本中都可用。


并非所有发行版都有--output=avail
Yzmir Ramirez,

1
好观察。这就是答案的最后一句话。@YzmirRamirez ;-)
trs

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

您可以通过这种方式获得字节大小。


并非所有发行版都有--output=avail
Yzmir Ramirez,

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

1

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

df -h / dir / inner_dir /

 or

df -sh / dir / inner_dir /

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

df-k / dir / inner_dir /


0

在命令外壳中输入:

 df -h 

要么

df -m

要么

df -k

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

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

类型:

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.