零、前言

当别人使用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目录传输文件,开启脚本进行检测,效果如下:

image-20240531203403390

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

image-20240531205209472

四、更新日志

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