Skip to content

Instantly share code, notes, and snippets.

@knightli
Created December 8, 2013 16:06
Show Gist options
  • Select an option

  • Save knightli/7859539 to your computer and use it in GitHub Desktop.

Select an option

Save knightli/7859539 to your computer and use it in GitHub Desktop.
前两天下载东西时写的一段shell脚本, 可以监控下载文件大小变化, 当文件达到指定大小后, 倒计时30s自动关机. 执行环境: mac osx(其实linux下改改最后的关机脚本就能用起来, 最后关机的命令略有不同而已) @todo: 改成通用版本, 通过命令行参数获取filename和max
#!/bin/bash
#
# 功能: 监控文件名包含FILENAME的文件大小变化, 当大于指定MAX大小时, 自动倒计时WAIT秒, 然后关机
#
# todo:
# 1) 现在代码写的很定制化, 后续要改成从参数中读取FILENAME, MAX和WAIT
# 2) 后续可考虑配置文件作为输入, 可指定多个文件列表及max值, 主逻辑可改为全部下载完成后触发关机
# 文件名
FILENAME="cn_windows_8_1_pro_vl_x64_dvd_2971907.iso"
# 下载文件的目标大小
# 注: chrome下载时,可以用开发者工具在下载页断点打在Downloads.prototype.updated = function(download) {...} 这个函数里,然后观察download对象的total属性即可)
MAX=4032598016
# 取size
# 必须用grep的方式, 因为不同下载软件, 可能会加不同的后缀, 比如chrome会加crdownload
SIZE=`ls -la | grep $FILENAME | awk -F ' ' '{print $5}'`
echo "watch file [$FILENAME] ..."
echo
echo "current filesize: $SIZE"
echo "total filesize:$MAX"
echo "begin to watch..."
echo
echo
# 每秒钟查看一下最近一次获取的文件大小, 若还没下完, 就每秒循环跑这段逻辑
while [ $SIZE -lt $MAX ]
do
SIZE=`ls -la | grep $FILENAME | awk -F ' ' '{print $5}'`
echo `awk -v x=$SIZE -v y=$MAX 'BEGIN {printf "SIZE:%d,%.2f%%",x,x*100/y}'`
sleep 1
done
# 上面的循环跑出来了, 说明文件大小已经达到MAX
echo "reach max size"
# 等待WAIT设定的秒数后触发关机
WAIT=30
while [ $WAIT -gt 0 ]
do
echo "wait $WAIT s to shutdown..."
WAIT=$[WAIT-1]
sleep 1
done
# 关机
echo "shutdown!"
# 这里使用的是在osx平台上较推荐的做法: 用apple script通知finder执行关机操作
osascript -e 'tell application "Finder" to shut down'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment