最近在服务器上删除大量文件时,速度过慢,无法显示进度,在网上进行搜索发现没有完整的代码实现,于是尝试自己进行实现,主要有以下特性:
- 可自由定制进度条颜色
- 根据文件数量调整百分比增量
- 一键修改进度条长度
- 格式化输出控制长度
- 实时显示当前操作文件
其中多彩进度条部分主要参考shell脚本实现多彩进度条博客中内容,颜色控制代码总结如下:
其他样式 | 1(粗体/高亮) | 22(非粗体) | 4(单条下划线) | 24(无下划线) | 5(闪烁) | 25(无闪烁) | 7(反显、翻转前景色和背景色) | 27(无反显) |
字体颜色 | 30(黑) | 31(红) | 32(绿) | 33(黄) | 34(蓝) | 35(洋红) | 36(青) | 37(白) |
背景色 | 40(黑) | 41(红) | 42(绿) | 43(黄) | 44(蓝) | 45(洋红) | 46(青) | 47(白) |
整体代码如下:
#!/bin/bash -xe
remove(){
i=0
count=0
bar=""
flen=$(ls -l "$1"| grep "^-" -c)
blen=40
if [ "${flen}" -eq 0 ];
then
printf "dir %s is empty\n" "$1"
return
else
printf "dir %s have %d files\n" "$1" "$flen"
add=$(echo "scale=6;100/$flen"|bc)
badd=$(echo "$flen/$blen"|bc)
((badd++))
# echo "$flen", "$badd", "$add"
list=$(ls "$1")
for file in $list
do
i=$(echo "$i+$add"|bc)
((count++))
if [ $(echo "$count%$badd"|bc) -eq 0 ];
then
bar+='='
fi
printf "\e[32;1m[%-*s][%6.2f%% %4d/%d] %21s\r" "$blen" "$bar" "$i" "$count" "$flen" "$file"
rm "$1""$file"
done
bar+='='
i=100
printf "\e[32;1m[%-*s][%6.2f%% %4d/%d] %21s\n" "$blen" "$bar" "$i" "$count" "$flen" "$file"
printf "\e[0m"
fi
}
path=detection/
remove $path
flen为文件夹下所有文件数量,用于判断文件夹是否为空,以及计算百分比增量
blen用于设置进度条总长度,以及控制进度条增量,通过"%-*s" “blen” "bar"动态设置输出字符宽度
运行结果如下图所示:
如果要使进度条颜色随进度更改,可对代码做如下改动:
((col=30+count%8))
printf "\e[%d;1m[%-*s][%6.2f%% %4d/%d] %21s\r" "$col" "$blen" "$bar" "$i" "$count" "$flen" "$file"
此时运行结果如下图所示: