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

Linux 检查bash中当前分区的可用磁盘空间,linux,bash,Linux,Bash,我正在用bash编写安装程序。用户将转到目标目录并运行安装脚本,因此第一个操作应该是检查是否有足够的空间。我知道df将报告所有文件系统,但我想知道是否有办法仅为目标目录所在的分区获取可用空间 编辑-我想出的答案 df $PWD | awk '/[0-9]%/{print $(NF-2)}' 有点奇怪,因为df似乎对其输出进行了格式化以适应终端,因此使用长装载点名称时,输出向下移动一行是: df -k . 对于当前目录 df -k /some/dir 如果要检查特定目录 df -k /som

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

编辑-我想出的答案

df $PWD | awk '/[0-9]%/{print $(NF-2)}'
有点奇怪,因为df似乎对其输出进行了格式化以适应终端,因此使用长装载点名称时,输出向下移动一行

是:

df -k .
对于当前目录

df -k /some/dir
如果要检查特定目录

df -k /some/dir
如果您的系统有
stat(1)
命令,您可能还想查看该命令。您可以指定输出格式,使脚本更容易解析。这里有一个小例子:

$ echo $(($(stat -f --format="%a*%S" .)))
  • df
    命令:报告文件系统磁盘空间使用情况
  • du
    命令:估计文件空间使用量
  • 键入
    df-h
    df-k
    以列出可用磁盘空间:

     $ df -h
    

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

     $ du -sh
    

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

    我认为这应该是对ThinkingMedia关于这个问题的答案()的评论或编辑,但我不允许评论(没有足够的重复),我的编辑被拒绝(原因:“这应该是评论或回答”)。 所以,宇宙的力量们,请不要因为我重复和修正了别人的“答案”而责怪我。但互联网上有人错了!™ 他们不让我修

    代码

      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\u TARGET\u目录
    可能比安装到
    df-k“$PWD”
    更有意义。
    最后,请注意,
    --output
    标志在df/linux的每个版本中都不可用。

    要了解linux中GB或TB中特定目录的用法,命令如下:

    df-h/dir/internal\u dir/

     or
    
    df-sh/dir/internal\u dir/

    要知道linux中特定目录(以位为单位)的用法,命令如下:


    df-k/dir/internal_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
    
    !/bin/bash
    # -----------------------------------------------------------------------------------------
    #小结:检查装载量是否低于一定的配额,如果是这种情况,请发送邮件给我们
    #详细信息:如果低于5G,我们会通过电子邮件通知我们。诸如此类
    # -----------------------------------------------------------------------------------------
    #CRON:0,4,8,12,16***/var/www/httpd config/server\u scripts/clear\u root\u spool\u log.bash
    MOUNTP=/var/spool#安装要检查的驱动器
    LIMITSIZE=5485760#5G=10*1024*1024k#以GB为单位的限制尺寸(楼层配额)
    自由=$(df-k——输出=可用“$MOUNTP”| tail-n1)#df-k不是df-h
    LOG=/tmp/LOG-$(basename${0}).LOG
    MAILCMD=mail
    电子邮件ID=”dude@wheres.mycar"
    MAILMESSAGE=/tmp/tmp-$(basename${0})
    # -----------------------------------------------------------------------------------------
    功能电子邮件\u关于\u故障(){
    sMess=“$1”
    echo”“>$MAILMESSAGE
    回显“主机名:$(主机名)”>$MAILMESSAGE
    回显“日期和时间:$(日期)”>$MAILMESSAGE
    #电邮地址:
    echo-e“\n[$(日期+%Y%m%d\u%H%m%S%Z)]当前状态:\n\n”>>$MAILMESSAGE
    cat$sMess>>$MAILMESSAGE
    echo”“>>$MAILMESSAGE
    echo“***此电子邮件由$(basename$0)shell脚本生成***”>$MAILMESSAGE
    echo“***请不要回复此电子邮件,这只是通知电子邮件***”>$MAILMESSAGE
    #发送电子邮件(需要设置电子邮件客户端或发送邮件)
    $MAILCMD-s“针对$(主机名)AWS服务器的紧急邮件警报”“$EMAILIDS”<$MAILMESSAGE
    [[-f$MAILMESSAGE]]&&rm-f$MAILMESSAGE
    }
    # -----------------------------------------------------------------------------------------
    如果[[$FREE-lt$LIMITSIZE]];则
    echo“写入$LOG”
    echo“邮件错误:在$MOUNTP上的可用空间(配额)少于$MB($FREE/1000))!“| tee${LOG}
    echo-e“\n要删除的潜在文件:“| tee-a${LOG}”
    查找$MOUNTP-xdev-typef-size+500M-exec du-sh{}'| sort-rh | head-n20 | tee-a${LOG}
    电子邮件\u关于\u失败${LOG}
    其他的
    echo“目前$MOUNTP上的可用配额为$($FREE-$LIMITSIZE)/1000)))MB。"
    fi
    

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

    在命令shell中键入:

     df -h 
    

    df-m

    df-k

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

    您还可以显示/查看单个列

    类型:

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

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

    谢谢!stat看起来有点让我兴奋。阅读手册页表明我不想在我的df版本中使用-k,但是把路径放进去确实有帮助。啊-现在我明白了为什么要使用-k,这使计算更容易了!问题是很多系统默认使用512字节如果不指定
    -k
    ,则会阻塞(coreutils df默认为1k个块,因此在Linux上非常安全,但如果
    df -m |awk '{print $3}'