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获取传入的目标文件夹,运行脚本时直接执行./your_script.sh /path/to/target_folder即可,无需手动输入路径。 - 增加参数校验:如果未传参数或传入的不是目录,直接提示用法并退出,避免错误执行。
- 精准遍历子目录:用
"$target_dir"/*/匹配目标目录下的所有子目录(末尾的/会自动过滤掉文件)。 - 准确统计文件数:使用数组结合
nullglob(空目录时数组为空)和dotglob(包含隐藏文件)的方式统计,完全不受ls输出格式的影响,结果更可靠。如果不需要统计隐藏文件,去掉dotglob即可。
内容的提问来源于stack exchange,提问作者livist
相关产品推荐
相关产品推荐

