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

Bash脚本问题:如何正确统计指定文件夹子目录的文件数量

解决Bash脚本遍历指定文件夹子目录的问题

你的脚本主要有两个问题导致不符合预期:

  • 错误使用read $name:你需要接收脚本的命令行参数,但这里误用了read读取输入(而且语法错误,read后应该直接写变量名,不需要加$)。当$name为空时,$name/*会匹配根目录下的所有内容,自然出现了遍历无关文件夹的情况。
  • ls -l "$i" | wc -l统计文件数不准确:ls -l的输出第一行是total xxx,这会被计入计数导致结果多1;同时默认ls不会显示隐藏文件,统计的文件数量不完整。

下面是修正后的脚本,完全满足你的需求:

#!/bin/bash

# 检查是否传入了目标文件夹参数
if [ $# -ne 1 ]; then
    echo "用法: $0 <目标文件夹路径>"
    exit 1
fi

target_dir="$1"

# 校验目标路径是否为有效目录
if [ ! -d "$target_dir" ]; then
    echo "错误: $target_dir 不是有效的目录"
    exit 1
fi

# 遍历目标目录下的所有子目录
for subdir in "$target_dir"/*/; do
    # 过滤掉通配符不匹配时的无效结果
    [ -d "$subdir" ] || continue
    
    # 提取子目录名称(去除路径前缀和末尾的/)
    subdir_name="${subdir%/}"
    subdir_name="${subdir_name##*/}"
    
    # 统计子目录下的文件数量(包含隐藏文件)
    shopt -s nullglob dotglob
    files=("$subdir"*)
    file_count="${#files[@]}"
    shopt -u nullglob dotglob
    
    echo "$subdir_name $file_count"
done

修正说明:

  1. 正确接收命令行参数:用$1获取传入的目标文件夹,运行脚本时直接执行./your_script.sh /path/to/target_folder即可,无需手动输入路径。
  2. 增加参数校验:如果未传参数或传入的不是目录,直接提示用法并退出,避免错误执行。
  3. 精准遍历子目录:用"$target_dir"/*/匹配目标目录下的所有子目录(末尾的/会自动过滤掉文件)。
  4. 准确统计文件数:使用数组结合nullglob(空目录时数组为空)和dotglob(包含隐藏文件)的方式统计,完全不受ls输出格式的影响,结果更可靠。如果不需要统计隐藏文件,去掉dotglob即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 00:25:33