如何统计各级目录MP3文件数并列出最深目录(含汇总)?
统计所有层级目录中的MP3文件数量并降序排序
问题需求
需要生成一份包含所有层级目录中MP3文件数量的列表,按文件数降序排序,既能看到最深层级目录的文件数,也可以接受包含上级目录汇总数的输出。
现有命令
基础统计命令
find . -mindepth 1 -type f -iname "*.mp3" -printf '%P\0' | awk -F/ -vRS='\0' '{n[$1]++}; END{for (i in n) {printf(n[i]" "i" \n")};}' > ./foo.txt sort -rno ./foo.txt ./foo.txt
优化输出格式的命令
find . -mindepth 1 -type f -iname "*.mp3" -printf '%P\0' | awk -F/ -vRS='\0' '{n[$1]++}; END{for (i in n) {printf("%03d",n[i]);printf(" ");printf(substr(i,0,60));printf("\n")}; if(length(n)==0) print "NO mp3 found." }' > ./foo.txt sort -rno ./foo.txt ./foo.txt
目录结构示例
./dir_1/fileA.mp3 ./dir_2/subdir_1/fileB.mp3 ./dir_2/subdir_2/fileC.mp3 ./dir_2/subdir_2/fileD.mp3 ...
当前输出(仅统计顶层目录)
# 实际得到的结果: 003 dir_2 001 dir_1
期望输出
仅展示最深层级目录
# 目标结果1: 002 dir_2/subdir_2 001 dir_2/subdir_1 001 dir_1
包含上级目录汇总的输出(可接受)
# 目标结果2: 003 dir_2 002 dir_2/subdir_2 001 dir_2/subdir_1 001 dir_1
问题分析
现有命令仅提取路径的第一个目录段($1)进行统计,会把子目录的MP3文件数全部汇总到顶层目录,无法展示更深层级的目录数据。由于目录深度不固定,无法通过-mindepth/-maxdepth参数固定层级;尝试过find -links 2,但该参数仅适用于目录类型(-type d),无法直接用于文件统计。
解决方案
方案1:仅统计最深层级目录(不含上级汇总)
核心思路:提取每个MP3文件的完整父目录路径,自动剔除包含子目录的上级目录,仅保留最深层级的统计结果。
find . -mindepth 1 -type f -iname "*.mp3" -printf '%h\0' | awk -vRS='\0' '{n[$0]++} END { if (length(n) == 0) { print "NO mp3 found." exit } # 标记并删除非最深层级的目录 for (dir in n) { parent = dir while (sub(/\/[^/]+$/, "", parent)) { delete n[parent] } } # 格式化输出并排序 for (dir in n) { printf "%03d %s\n", n[dir], dir } }' | sort -rn
方案2:统计所有层级目录(含上级汇总)
核心思路:提取每个MP3文件的所有父目录路径(从顶层到最深层),分别统计每个路径的文件总数。
find . -mindepth 1 -type f -iname "*.mp3" -printf '%h\0' | awk -vRS='\0' '{ # 拆分当前目录的所有父层级并统计 path = $0 n[path]++ while (sub(/\/[^/]+$/, "", path)) { n[path]++ } } END { if (length(n) == 0) { print "NO mp3 found." exit } # 格式化输出 for (dir in n) { printf "%03d %s\n", n[dir], dir } }' | sort -rn
说明
- 方案1仅保留没有子目录的最深层级目录统计,不会展示上级目录的汇总数;
- 方案2会统计每个目录(包括所有上级目录)的MP3总数,比如
dir_2的数量等于其下所有子目录的MP3数量之和; - 两个方案都通过
find的%h参数直接获取文件的父目录路径,避免手动拆分路径的误差; - 最终通过
sort -rn实现按数字降序排序,无需写入临时文件。
内容的提问来源于stack exchange,提问作者Jonathan
相关产品推荐
相关产品推荐

