Linux目录文件大小全自动检查脚本
零、前言
当别人使用scp或者rsync命令向你传输或拷贝文件时,如果文件太多,你又没有可视化进度,等待过程会非常寂寞,所以想找一款可以可视化的脚本。
脚本框架由AI生成,脚本中人性化细节为手动补充
完成这个脚本也对shell脚本有了更深的理解,在此记录。
一、脚本内容
脚本每隔0.5s检查一次目录大小,若5次检查大小没有变化则退出脚本,在文件传输或拷贝速度正常情况下,代表文件传输或拷贝已经停止。
#!/bin/bash
# 检查参数数量
if [ "$#" -ne 1 ]; then
echo "Usage: $0 <directory-path>"
exit 1
fi
# 获取第一个参数
directory_PATH="$1"
# 检查文件夹是否存在
if [ ! -d "$directory_PATH" ]; then
echo "Error: directory does not exist."
exit 1
fi
# 初始化变量
SIZE=""
COUNT=0
MAX_COUNT=5
# 循环每0.5秒检查一次文件夹大小
while true; do
# 使用du命令检查文件夹大小
CURRENT_SIZE=$(du -sh "$directory_PATH" | awk '{print $1}')
CURRENT_SIZE_KB=$(du -s "$directory_PATH" | awk '{print $1}')
# 如果文件夹大小未变,则增加计数
if [ "$CURRENT_SIZE_KB" == "$SIZE" ]; then
((COUNT++))
else
# 如果大小变化,重置计数器和SIZE变量
SIZE="$CURRENT_SIZE_KB"
COUNT=0
fi
# 输出当前文件夹大小
echo "Current size: $CURRENT_SIZE_KB($CURRENT_SIZE)"
# 如果连续5次大小未变,则退出
if [ "$COUNT" -ge "$MAX_COUNT" ]; then
echo "directory size has not changed for 5 consecutive checks. Exiting."
exit 0
fi
# 睡眠0.5秒
sleep 0.5
done
二、关键语法和参数
| 语法和参数 | 描述 |
|---|---|
if [ "$#" -ne 1 ] | 判断脚本执行参数是否不等于1,$#代表携带的参数数量,若参数数量不是1,则退出脚本并提醒正确命令格式。 |
if [! -d "$directory_PATH" ] | 判断这个变量是否为目录文件,若不是目录文件则退出脚本并提示。 |
du -sh "$directory_PATH" | awk '{print $1}' | 使用du命令检查文件夹大小,然后使用awk命令提取出第一个字段,即文件夹大小。-sh参数中s代表目录文件大小汇总、h代表以人类可读方式输出。 |
if [ "$COUNT" -ge "$MAX_COUNT" ] | 判断目前计数是否大于等于设定的计数值5.如果是,则输出提示信息并退出脚本。 |
| 判断语法 | 描述 |
|---|---|
-ne | 意思为not equal,不等于 |
-eq | 意思为equal,等于 |
-ge | 意思为greater than or equal,大于等于 |
三、效果展示
在测试文件夹下创建了该脚本test.sh以及用于测试的目录文件tran_test_dir。使用rsync命令向tran_test_dir目录传输文件,开启脚本进行检测,效果如下:

当数据传输完成后,目录大小不再变化,对比后退出脚本,代表传输完毕。

四、更新日志
| 更新时间 | 更新内容 |
|---|---|
| 20240529 | AI生成脚本框架,具有脚本参数检测和循环检查目录大小的功能 |
| 20240530 | 添加目录大小对比和退出脚本的功能 |
| 20240531 | 1. 测试bug:检查目录大小参数为-sh,若传输速度较慢,单位到达M或G时,此单位下的输出大小变化很慢,导致提前退出脚本。2. 新增一组 -s参数目录大小检测,并用KB单位作为目录大小对比,修复提前退出的bug。 |
版权声明:
本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自
keeshow!
喜欢就支持一下吧