如何在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脚本有两个关键问题:
- 累加变量被覆盖:你先写了
s+=$5累加字节数,但后面立刻用s=1把这个累加值覆盖了,导致根本没计算总和。 - 逐个文件输出:你对每个文件的大小单独做了单位转换并输出,所以得到的是每个文件的大小列表,而不是所有文件的总和。
额外优化点
- 用
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




