侧边栏壁纸
博主头像
colo

欲买桂花同载酒

  • 累计撰写 1823 篇文章
  • 累计收到 0 条评论

统计指定目录下不同文件类型的数量

2025-12-8 / 0 评论 / 4 阅读

题目

统计指定目录下不同文件类型的数量

信息

  • 类型:问答
  • 难度:⭐⭐

考点

文件操作,循环控制,文本处理,关联数组

快速回答

实现步骤:

  1. 使用find命令遍历目录获取文件列表
  2. 通过file命令提取文件类型信息
  3. 利用关联数组统计不同类型出现的次数
  4. 格式化输出统计结果

示例代码核心:

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

最佳实践

  1. 使用 mime-type 而非纯文本描述,确保类型一致性
  2. 避免解析 ls 输出,用 find 处理特殊字符
  3. 添加帮助信息:参数校验、用法说明
  4. 扩展功能建议:
    - 添加 -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]}'