Mac——查看文件占用情况


整体说明

  • 快速查看非隐藏第一层目录大小:du -sh */
  • 包含隐藏目录:find . -maxdepth 1 -type d ! -name "." -exec du -sh {} \;
  • 按大小排序:在上述命令后加 | sort -hr
  • 查看逻辑大小(对应稀疏文件):du -shL */

最常用:显示第一层目录大小(人类可读格式,如 M/G)

  • 命令详情:

    1
    du -sh */
  • 命令解释:

    • du:统计目录/文件的磁盘占用;
    • -s--summarize):只显示总大小(不列出子文件/子目录的详细大小);
    • -h--human-readable):用人类易读的单位(K/M/G)显示;
    • */:通配符,只匹配当前目录下的「第一层子目录」(结尾的 / 是关键,排除文件,只选目录);
  • 简单直接,默认显示「实际磁盘占用」(和 Linux du -sh */ 逻辑一致),适合快速查看


精准筛选第一层目录(避免通配符遗漏,如隐藏目录)

  • */ 会匹配所有非隐藏的第一层目录,但如果有「隐藏目录」(如 .hidden_dir),会被遗漏

  • 如果需要包含隐藏目录,用 find 筛选第一层目录,再传递给 du

    1
    2
    # 包含隐藏目录的第一层目录大小(人类可读)
    find . -maxdepth 1 -type d ! -name "." -exec du -sh {} \;
  • 命令解释:

    • find .:从当前目录(.)开始查找;
    • -maxdepth 1:只查找「第一层」(不递归子目录);
    • -type d:只匹配目录(排除文件);
    • ! -name ".":排除当前目录本身(只保留子目录);
    • -exec du -sh {} \;:对找到的每个目录,执行 du -sh 统计总大小;

按大小排序(方便找出最大目录)

  • 如果想按目录大小「从大到小排序」,结合 sort 命令(Mac 自带 BSD sort,参数和 Linux 略有差异):

    1
    2
    3
    4
    5
    # 第一层目录大小(非隐藏),按大小降序排序
    du -sh */ | sort -hr

    # 包含隐藏目录,按大小降序排序
    find . -maxdepth 1 -type d ! -name "." -exec du -sh {} \; | sort -hr
  • 命令解释:

    • sort -hr-h 识别人类可读单位(如 M/G),-r 反向排序(从大到小);

显示「逻辑大小」(而非磁盘占用,对应稀疏文件场景)

  • 如果想查看目录的「逻辑总大小」(而非磁盘占用,和 ls 统计逻辑一致),用 du -shL */

    1
    2
    # 第一层目录的逻辑总大小(人类可读)
    du -shL */
  • 命令解释:

    • -L--dereference):跟随符号链接,并统计链接指向文件的「逻辑大小」(而非磁盘占用);
    • 适合用于确认目录的逻辑总数据量(比如对比 Linux 上的逻辑大小)

关键补充:Mac 和 Linux 的 du 差异

  • 单位一致性:-h 参数在 Mac 和 Linux 上行为一致(K/M/G 单位);
  • 隐藏目录:Mac 上 */ 不匹配隐藏目录,需用 find 命令包含;
  • 稀疏文件:Mac 上 du 默认统计「实际磁盘占用」,如果目录内有稀疏文件(未展开),du -sh 显示实际占用,du -shL 显示逻辑大小

统计一个文件夹下所有数据逻辑大小

  • 递归列出所有数据,加起来,并以 MB(兆字节)为单位输出(Mac 和 Linux 通用):

    1
    ls -lR ./ | awk '{sum += $5} END {print sum/1024/1024 "M"}'
  • 命令解释

    • ls -lR ./:递归输出当前目录下所有文件/目录的详细信息(作为数据源)
      • -R(recursive,递归):不仅列出当前目录的文件/目录,还会递归列出所有子目录下的文件/目录
      • 注意:不包括隐藏文件和文件夹,可以通过改为下面的指令来显示隐藏文件
        • ls -laR ./,包含 ...ls -l 中目录的第5列是“目录元数据大小”(不是目录内文件总大小),数值极小,可以忽略)
        • ls -lAR ./,不包含 ...
    • awk '{sum += $5} END {print sum/1024/1024 "M"}':计算所有文件的逻辑大小总和,并转换为 MB 单位
      • awk 是文本处理工具,这里用于“提取第5列的字节数,求和后转换为 MB”:
      • 循环累加({sum += $5}):
        • $5:表示取每一行的「第5个字段」(awk 中用 $n 表示第n个字段,字段默认用空格分隔)
        • sum += $5:定义一个变量 sum,把每一行第5列的数值(文件逻辑大小,字节)累加到 sum
        • 注意:目录的第5列(几十字节)也会被累加,但因为数值极小,对总结果几乎无影响(比如100个目录的元数据总和可能只有几 KB,相对于几百 MB 的文件总和可忽略)
      • 最终输出(END {print sum/1024/1024 "M"}):
        • END:表示“所有行都处理完后,执行以下操作”(仅执行一次)
        • sum/1024/1024:单位转换:字节 -> KB(除以1024)-> MB(再除以1024)
        • "M":拼接字符串,让输出结果带单位(比如 600M 而非纯数字)
        • print:输出最终结果

注意统计的是「逻辑大小」,不是「磁盘实际占用」

  • 逻辑大小:文件本身的“理论大小”(比如稀疏文件的预留空间、普通文件的实际数据大小),和 ls -lh 显示的大小一致;
  • 磁盘实际占用:文件在磁盘上真正占用的空间(比如稀疏文件的实际写入数据大小),需用 du 统计;
  • ls -l 中目录的第5列是“目录元数据大小”(不是目录内文件总大小),但因为数值极小(通常几十字节),累加后对总结果(几百 MB)几乎无影响,无需刻意排除