题目
统计指定目录下不同文件类型的数量
信息
- 类型:问答
- 难度:⭐⭐
考点
文件操作,循环控制,文本处理,关联数组
快速回答
实现步骤:
- 使用
find命令遍历目录获取文件列表 - 通过
file命令提取文件类型信息 - 利用关联数组统计不同类型出现的次数
- 格式化输出统计结果
示例代码核心:
declare -A count
for f in $(find "$dir" -type f); do
type=$(file -b "$f" | cut -d, -f1)
((count["$type"]++))
done
## 解析
问题分析
该问题要求统计指定目录下不同文件类型的数量,需要处理:
- 递归遍历目录及其子目录
- 准确识别文件类型(非仅扩展名)
- 高效聚合统计结果
- 处理特殊字符的文件名
完整解决方案
#!/bin/bash
dir="${1:-.}" # 使用参数或当前目录
declare -A count # 声明关联数组
# 使用find安全处理文件名
while IFS= read -r -d $'\0' file; do
# 提取基础文件类型
type=$(file -b --mime-type "$file" | cut -d/ -f1)
# 排除目录
[[ "$type" == "inode" ]] && continue
((count["$type"]++))
done < <(find "$dir" -type f -print0)
# 输出结果
printf "%-20s %s\n" "文件类型" "数量"
for type in "${!count[@]}"; do
printf "%-20s %d\n" "$type" "${count[$type]}"
done关键点说明
- 安全文件名处理:
find -print0+read -d $'\0'正确处理含空格/换行符的文件名 - 文件类型识别:
-file -b:简洁输出(去文件名)
---mime-type:标准化输出(如 application/pdf)
-cut -d/ -f1:提取主类型(如 application) - 关联数组:
declare -A实现键值对统计,支持动态键名 - 错误处理:检查目录存在性(可添加
[ ! -d "$dir" ] && exit 1)
最佳实践
- 使用
mime-type而非纯文本描述,确保类型一致性 - 避免解析
ls输出,用find处理特殊字符 - 添加帮助信息:参数校验、用法说明
- 扩展功能建议:
- 添加-t参数控制类型显示层级
- 支持多目录输入
- 输出排序(sort -k2nr)
常见错误
| 错误 | 后果 | 修复方案 |
|---|---|---|
| 未处理文件名空格 | 错误拆分文件路径 | 使用 find -print0 |
| 仅依赖扩展名 | 统计不准确(如无扩展名文件) | 使用 file 命令 |
| 未过滤目录 | 统计结果包含目录项 | find -type f + 跳过 inode 类型 |
扩展知识
- 文件类型原理:
file命令通过 magic number(文件头特征字节)识别类型 - 性能优化:大目录时用
find -exec替代循环(减少子进程) - 替代方案:
fd -t f -0 | xargs -0 file -b --mime-type | awk '{count[$1]++} END {for(t in count) print t, count[t]}'