You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何统计各级目录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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 13:52:37