题目
统计目录下普通文件数量
信息
- 类型:问答
- 难度:⭐
考点
目录遍历, 条件判断, 变量操作
快速回答
使用for循环遍历目录,通过-f判断普通文件并计数:
- 初始化计数器变量
- 遍历目录项检查文件类型
- 排除子目录干扰
- 输出最终计数结果
问题目标
编写Shell脚本统计指定目录中普通文件的数量(不包括子目录和特殊文件)。
核心原理
通过循环遍历目录中的每个条目,使用-f测试运算符判断是否为普通文件,并对符合条件的文件进行计数。
代码示例
#!/bin/bash
dir_path="${1:-.}" # 使用第一个参数或当前目录
count=0
for item in "$dir_path"/*; do
if [ -f "$item" ]; then
((count++))
fi
done
echo "普通文件数量: $count"最佳实践
- 参数处理:使用
${1:-.}设置默认当前目录 - 引号包裹:变量用双引号包裹(如
"$dir_path"/*)避免空格问题 - 明确计数:使用
((count++))算术运算替代let或外部命令 - 错误处理:可增加目录存在性检查:
[ ! -d "$dir_path" ] && echo "错误:目录不存在" && exit 1
常见错误
- 未处理隐藏文件:模式
/*不匹配.开头的文件,需改为"$dir_path"/* "$dir_path"/.*并排除.和.. - 包含子目录:误用
-e(存在即计数)而非-f - 空格问题:变量未加引号导致路径含空格时被拆分成多个参数
- 符号链接:
-f会统计指向普通文件的链接,若需排除可增加! -L判断
扩展知识
- 替代方案:使用
find命令更高效:find "$dir_path" -maxdepth 1 -type f -printf . | wc -c - 文件类型检测:
-f:普通文件-d:目录-L:符号链接-e:存在即可 - 性能考量:对于超大目录,
find方案比Shell循环更高效 - 递归统计:移除
-maxdepth 1可统计子目录文件