You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Solaris KSH Shell脚本中按指定扩展名统计总文件大小(MB/GB/KB)

解决Solaris KSH中计算指定文件总大小的问题

看起来你之前的命令是把每个文件的大小单独转换输出了,而不是计算总和后统一转换。咱们来修正这个问题,核心思路是先累加所有文件的字节数总和,再对总和进行单位转换,而不是逐个处理文件。

修正后的脚本命令

下面是可以直接用的KSH脚本片段,它会计算所有匹配文件的总大小,并自动转换为最合适的单位(比如KB/MB/GB):

# 替换为你的目标目录路径
EXPDP_DIR_PATH="/your/target/directory"
# 目标文件的匹配模式
FILE_PATTERN="DotNet_LI_TRADES_pre_release_*_12092017.log"

# 计算总大小并转换单位
BACKUP_SIZE=$(find "$EXPDP_DIR_PATH" -name "$FILE_PATTERN" -exec du -b {} + | awk '
BEGIN {
    # 定义单位列表,从字节到YB
    split("B KB MB GB TB PB EB ZB YB", units)
    # 二进制转换因子(1024)
    factor = 1024
    total_bytes = 0
}
{
    # 累加每个文件的字节数(du -b的第一列是字节数)
    total_bytes += $1
}
END {
    size = total_bytes
    unit_index = 1
    # 自动转换到合适的单位
    while (size >= factor && unit_index < length(units)) {
        size /= factor
        unit_index++
    }
    # 输出保留两位小数的结果
    printf "%.2f %s", size, units[unit_index]
}')

# 打印最终总大小
echo "$BACKUP_SIZE"

为什么原来的命令不对?

你之前的AWK脚本有两个关键问题:

  1. 累加变量被覆盖:你先写了s+=$5累加字节数,但后面立刻用s=1把这个累加值覆盖了,导致根本没计算总和。
  2. 逐个文件输出:你对每个文件的大小单独做了单位转换并输出,所以得到的是每个文件的大小列表,而不是所有文件的总和。

额外优化点

  • du -b {} +代替ls -ltr {} \;du -b直接输出文件的字节数,比ls -l更可靠;+让find批量处理文件,比逐个调用ls效率更高,尤其是文件数量多的时候。
  • 自动适配单位:脚本会根据总大小自动选择最合适的单位(比如总大小是66GB就输出GB,是几百MB就输出MB),不需要手动指定。

如果想要强制输出某个特定单位(比如强制转成GB),可以修改END块的逻辑:

END {
    # 强制转换为GB(1GB = 1024*1024*1024字节)
    size = total_bytes / (1024 * 1024 * 1024)
    printf "%.2f GB", size
}

内容的提问来源于stack exchange,提问作者Abhinav

火山引擎 最新活动