You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写Shell脚本统计目录文件数并生成表格时遇挂起问题求助

脚本修复与优化方案

问题根源

  1. 挂起问题:原脚本中files=$(wc -l)未指定输入源,wc -l会默认等待标准输入内容,而while read dir已经占用了标准输入读取dirs.txt,导致脚本卡住。
  2. 表格生成问题:每次循环调用print_table会生成独立表格,无法实现多目录数据在同一表格展示;且函数定义在循环内部属于冗余操作。
  3. 统计逻辑错误:未实际统计目标目录的文件数量,仅执行了无输入的wc -l,无法获取有效数据。

优化后的脚本

#!/bin/bash

# 定义生成表格的函数,仅定义一次
print_table() {
  perl -MText::ASCIITable -e '
    $t = Text::ASCIITable->new({drawRowLine => 1});
    # 处理表头参数
    while (defined($c = shift @ARGV) and $c ne "--") {
      push @header, $c;
      $cols++
    }
    $t->setCols(@header);
    # 按列数拆分数据为行
    my $rows = @ARGV / $cols;
    for my $i (0..$rows-1) {
      my @row;
      for my $j (0..$cols-1) {
        push @row, $ARGV[$j * $rows + $i];
      }
      $t->addRow(\@row);
    }
    print $t' "$@"
}

# 存储所有目录的统计数据
data=()

# 读取dirs.txt中的目录,统计每个目录的文件数
while IFS= read -r dir; do
  # 跳过空行
  [[ -z "$dir" ]] && continue
  # 检查目录是否存在
  if [[ -d "$dir" ]]; then
    # 统计目录下的文件数量(仅一级,不递归)
    file_count=$(find "$dir" -maxdepth 1 -type f | wc -l)
    # 将目录路径和文件数加入数据数组
    data+=("$dir" "$file_count")
  else
    # 目录不存在时标记为无效
    data+=("$dir" "无效目录")
  fi
done < dirs.txt

# 调用函数生成统一表格
print_table Directory 'Files Created' -- "${data[@]}"

修改说明

  • 解决挂起:替换原无效的files=$(wc -l),改为用find命令明确统计目标目录的文件数量,避免无输入的wc等待。
  • 统一表格:先收集所有目录的统计数据到数组,再一次性传给print_table函数,生成包含所有数据的单个表格。
  • 函数优化:将print_table移到循环外部,仅定义一次,提升效率。
  • 鲁棒性提升:加入空行跳过、目录存在性检查,对无效目录进行标记。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 23:30:15