在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" .)))
-
df
命令:报告文件系统磁盘空间使用情况 -
du
命令:估计文件空间使用情况
键入df -h
或df -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;