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

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

编辑 – 我想出来的答案

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

有点奇怪,因为DF似乎格式化其输出,以适应terminal,所以与一个长安装点名称的输出是下移一行

是:

 df -k . 

为当前目录。

 df -k /some/dir 

如果你想检查一个特定的目录。

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

 $ echo $(($(stat -f --format="%a*%S" .))) 
  1. df命令:报告文件系统磁盘空间使用情况
  2. du命令:估计文件空间使用情况

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

  $ df -h 

要么

  $ df -k 

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

  $ du -sh 

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

我认为这应该是一个评论或编辑ThinkingMedia在这个问题上的答案( 检查在bash当前分区的可用磁盘空间 ),但我不能评论(没有足够的代表),我的编辑已被拒绝(原因: “这应该是一个评论或答案”)。 所以,请问,这个宇宙的力量,不要因为重复和修复别人的“回答”而使我受伤。 但互联网上有人错了!他们不会让我修复它。

代码

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

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

要创build一个脚本以检查一定量的可用磁盘空间,您必须知道要检查的单元。 删除它(如上例中的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版本中都不可用。

要知道在linux或者GB中的特定目录的使用情况,

df -h / dir / inner_dir /

  or 

df -sh / dir / inner_dir /

并且要知道在linux中指定的特定目录的使用情况,

df-k / dir / inner_dir /

一个完整的例子,可能希望使用它来监视服务器上的挂载点。 这个例子将检查/ 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 
 df --output=avail -B 1 "$PWD" |tail -n 1 

你用这种方法得到字节大小。

以字母的可读格式获取当前的可用磁盘空间。 以下内容将输出当前分区的可用空间,放下标题和带状字母。

 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;