我正在用bash编写安装程序。用户将转到目标目录并运行安装脚本,因此第一个操作应该是检查是否有足够的空间。我知道df将报告所有文件系统,但是我想知道是否有一种方法可以仅针对目标目录所在的分区获取可用空间。
编辑-我想出的答案
df $PWD | awk '/[0-9]%/{print $(NF-2)}'
有点奇怪,因为df似乎会格式化其输出以适合终端,因此对于长安装点名称,输出将下移一行
du -hs .
查看当前目录使用的磁盘空间。
我正在用bash编写安装程序。用户将转到目标目录并运行安装脚本,因此第一个操作应该是检查是否有足够的空间。我知道df将报告所有文件系统,但是我想知道是否有一种方法可以仅针对目标目录所在的分区获取可用空间。
编辑-我想出的答案
df $PWD | awk '/[0-9]%/{print $(NF-2)}'
有点奇怪,因为df似乎会格式化其输出以适合终端,因此对于长安装点名称,输出将下移一行
du -hs .
查看当前目录使用的磁盘空间。
Answers:
是:
df -k .
用于当前目录。
df -k /some/dir
如果要检查特定目录。
您可能还想签出该stat(1)
命令(如果您的系统具有该 命令)。您可以指定输出格式,以使脚本更易于解析。这是一个小例子:
$ echo $(($(stat -f --format="%a*%S" .)))
-k
。(coreutils df默认为1k块,因此尽管在Linux上您还是很安全的-但是,如果您有coreutils,则有了stat
,这甚至更安全-无需解析)。
%a*%s
改为%a*%S
。我不确定这是区别还是错别字。
%S
(大写)。找不到%s != %S
在我也可以访问的几个RedHat上的文件系统,因此无法检查:-(
我认为这应该是对这个问题(在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
某人可能想使用它来监视服务器上的安装点的完整示例。此示例将检查/ 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 -h
要么
df -m
要么
df -k
它将显示每个安装点的可用磁盘空间列表。
您也可以显示/查看单列。
类型:
df -m |awk '{print $3}'
注意:这里3是列号。您可以选择所需的列。
-P
标记为df
,您将全部获得一行。