find 命令需结合 awk 或 sort+uniq 才能统计特定目录下各类文件扩展名数量:先找普通文件,再提取扩展名,最后分组计数;推荐命令为 find /path/to/dir -type f -name '.' -printf '%f\n' | awk -f. '{if (nf>1) print $nf}' | sort | uniq -c | sort -nr。

要统计特定目录下各类文件(按扩展名)的数量,find 本身不直接提供“按类型分组计数”的功能,但可以结合 find、awk 或 sort+uniq 实现。核心思路是:找出所有普通文件 → 提取扩展名 → 统计每种扩展名出现次数。
提取扩展名并统计数量(推荐)
运行以下命令可列出当前目录(含子目录)中所有普通文件的扩展名及其出现次数:
find /path/to/dir -type f -name '*.*' -printf '%f\n' | awk -F. '{if (NF>1) print $NF}' | sort | uniq -c | sort -nr
说明:
-
-type f只匹配普通文件,排除目录、链接等 -
-name '*.*'过滤带点的文件名(避免无扩展名文件干扰) -
-printf '%f\n'只输出文件名(不含路径),便于后续处理 -
awk -F. '{if (NF>1) print $NF}'以点为分隔符,取最后一段作为扩展名(如report.pdf→pdf) -
sort | uniq -c排序后统计重复行次数 -
sort -nr按数量降序排列,方便一眼看出最多的是哪种文件
包含无扩展名文件的统计
有些重要文件(如 Makefile、.gitignore、README)没有点或扩展名,若需一并统计,可改用:
find /path/to/dir -type f -printf '%f\n' | awk -F. '{print (NF>1) ? $NF : "noext"}' | sort | uniq -c | sort -nr
该命令将无扩展名文件统一归类为 noext,确保不遗漏。
仅统计某类文件(如 .log 和 .txt)
如果只想快速知道几种特定扩展名的文件各有多少个,更高效的方式是分别查:
find /path/to/dir -type f -name "*.log" | wc -lfind /path/to/dir -type f -name "*.txt" | wc -l- 也可合并:
find /path/to/dir -type f \( -name "*.log" -o -name "*.txt" \) | wc -l(但无法区分各自数量)
注意边界情况
扩展名统计存在几个常见陷阱:
- 文件名含多个点(如
archive.tar.gz)会被识别为gz,而非tar.gz;如需完整后缀,可用sed 's/.*\.//'替代awk,但逻辑更复杂 - 隐藏文件(如
.bashrc)会被-name '*.*'忽略,因开头是点;如需包含,去掉该条件或改用-regex '.*\..*' - 大小写敏感:默认
find区分.JPG和.jpg;如需合并统计,可在awk后加| tr '[:upper:]' '[:lower:]'











