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

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

编辑-我想到的答案

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

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

254597 次浏览

是的:

df -k .

为了工作目录。

df -k /some/dir

如果要检查特定的目录。

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

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

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

 $ df -h

或者

 $ df -k

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

 $ du -sh

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

我认为这应该是一个评论或编辑思想媒体的回答,这个问题(检查 bash 中当前分区的可用磁盘空间) ,但我不允许评论(没有足够的代表) ,我的编辑已被拒绝(理由: “这应该是一个评论或答案”)。 所以,宇宙的力量,请不要因为我重复和修正别人的“答案”而责备我。但是网上有人错了,他们不让我修。

密码

  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"更有意义。 最后,请注意,在 df/linux 的每个版本中都没有 --output标志。

要了解 Linux 中 GB 或 TB 中特定目录的用法,命令是,

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

你可以通过这种方式得到字节大小。

输入命令 shell:

 df -h

或者

Df-m

或者

该死

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

也可以显示/查看单列。

类型:

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

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

这是一个每个人都有自己喜欢的方法的问题,但是因为这些年我已经回到这个页面好几次了,我将分享我的一个解决方案(受到这里其他人的启发)。

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}')

因为它只是使用 df并通过 awk提取行/列,所以它应该是相当可移植的。

然后你可以把这个用在脚本里,比如:

"${DISK_SIZE_FREE}" available out of "${DISK_SIZE_TOTAL}" total ("${DISK_PERCENT_USED}" used).

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

最终结果如下:

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