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

Gre*_*lds 110 linux bash

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

编辑 - 我想出的答案

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

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

Mat*_*Mat 190

是:

df -k .
Run Code Online (Sandbox Code Playgroud)

对于当前目录.

df -k /some/dir
Run Code Online (Sandbox Code Playgroud)

如果要检查特定目录.

stat(1)如果您的系统具有该命令,您可能还需要检查该 命令.您可以指定输出格式,以便脚本更容易解析.这是一个小例子:

$ echo $(($(stat -f --format="%a*%S" .)))
Run Code Online (Sandbox Code Playgroud)

  • 在我的Red-Hat中,格式字符串应该是'%a*%s`而不是'%a*%S`.我不确定这是差异还是拼写错误. (2认同)

Gir*_*ish 41

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

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

 $ df -h
Run Code Online (Sandbox Code Playgroud)

要么

 $ df -k
Run Code Online (Sandbox Code Playgroud)

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

 $ du -sh
Run Code Online (Sandbox Code Playgroud)

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


trs*_*trs 22

我认为这应该是ThinkingMedia在这个问题上的答案的评论或编辑(在bash中检查当前分区的可用磁盘空间),但我不允许评论(不够代表)并且我的编辑被拒绝(原因: "这应该是评论或答案").所以请,SO宇宙的力量,不要因为重复和修复别人的"答案"而该死我.但是互联网上有人错了!™他们不会让我解决它.

代码

  df --output=avail -h "$PWD" | sed '1d;s/[^0-9]//g'
Run Code Online (Sandbox Code Playgroud)

有一个很大的缺陷:是的,它将50G免费输出50 - 但它也将5.0M免费输出50或3.4G免费34或15K15免费.

要创建一个脚本以检查一定数量的可用磁盘空间,您必须知道要检查的单元.删除它(如上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;
Run Code Online (Sandbox Code Playgroud)

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


Jes*_*les 7

这是每个人都有自己最喜欢的方法的问题之一,但由于多年来我多次返回此页面,我将分享我的解决方案之一(受到其他人的启发)。

DISK_SIZE_TOTAL=$(df -kh . | tail -n1 | awk '{print $2}')
DISK_SIZE_FREE=$(df -kh . | tail -n1 | awk '{print $4}')
DISK_PERCENT_USED=$(df -kh . | tail -n1 | awk '{print $5}')
Run Code Online (Sandbox Code Playgroud)

因为它只是使用df和拉动行/列,所以awk它应该是相当可移植的。

然后您可以在脚本中使用它,例如:

"${DISK_SIZE_FREE}" available out of "${DISK_SIZE_TOTAL}" total ("${DISK_PERCENT_USED}" used).
Run Code Online (Sandbox Code Playgroud)

示例: https: //github.com/littlebizzy/slickstack/blob/master/bash/ss-install.txt

最终结果如下所示:

总共 20GB 中有 10GB 可用(已使用 50%)。


Mik*_*e Q 5

对于可能想要使用它来监视服务器上的安装点的人来说,这是一个完整的示例。此示例将检查 /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
Run Code Online (Sandbox Code Playgroud)


xer*_*mus 5

df --output=avail -B 1 "$PWD" |tail -n 1
Run Code Online (Sandbox Code Playgroud)

您可以通过这种方式获得大小(以字节为单位)。