编写Shell脚本统计目录文件数并生成表格时遇挂起问题求助
脚本修复与优化方案
问题根源
- 挂起问题:原脚本中
files=$(wc -l)未指定输入源,wc -l会默认等待标准输入内容,而while read dir已经占用了标准输入读取dirs.txt,导致脚本卡住。 - 表格生成问题:每次循环调用
print_table会生成独立表格,无法实现多目录数据在同一表格展示;且函数定义在循环内部属于冗余操作。 - 统计逻辑错误:未实际统计目标目录的文件数量,仅执行了无输入的
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
相关产品推荐
相关产品推荐

