Linux 检查bash中当前分区的可用磁盘空间
我正在用bash编写安装程序。用户将转到目标目录并运行安装脚本,因此第一个操作应该是检查是否有足够的空间。我知道df将报告所有文件系统,但我想知道是否有办法仅为目标目录所在的分区获取可用空间 编辑-我想出的答案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
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}'