Linux mdu 命令 - 显示MS-DOS目录磁盘使用情况

mdu 命令是mtools工具集的一部分,用于显示MS-DOS文件系统中目录的磁盘使用情况。它类似于Linux系统中的du命令,但专门用于MS-DOS格式的存储设备,可以递归计算目录及其所有子目录和文件占用的磁盘空间。

提示:mdu命令是mtools工具集的一部分,不是所有Linux系统默认安装。在某些系统中,可能需要手动安装mtools包。
mdu 与 Linux du 的区别
  • 文件系统:mdu专门用于MS-DOS文件系统(FAT12/FAT16/FAT32),du用于Linux文件系统
  • 访问方式:mdu直接操作设备文件,无需挂载;du需要访问已挂载的文件系统
  • 路径格式:mdu使用MS-DOS路径格式(如a:\directory),du使用Linux路径格式
  • 单位:mdu默认以KB为单位,du默认以512字节或1KB块为单位
  • 权限要求:mdu通常不需要root权限(如果用户有权访问设备),du需要文件系统访问权限

语法格式

mdu [选项] [MS-DOS目录路径]...

如果不指定目录路径,mdu会显示当前MS-DOS工作目录的磁盘使用情况。

常用选项

选项 说明
-a--all 显示所有文件的大小,不仅仅是目录
-s--summarize 仅显示总计大小,不显示每个子目录的详细信息
-v--verbose 详细模式,显示更多信息
-X--exclude 排除匹配指定模式的文件或目录
-k 以KB为单位显示大小(默认)
-m 以MB为单位显示大小
--help 显示帮助信息
--version 显示版本信息

安装mtools工具集

# 在Debian/Ubuntu系统中安装
sudo apt-get install mtools

# 在CentOS/RHEL系统中安装
sudo yum install mtools

# 在Fedora系统中安装
sudo dnf install mtools

# 在Arch Linux中安装
sudo pacman -S mtools

# 验证安装并查看mdu帮助
mdu --help

基本示例

示例1:显示当前MS-DOS目录的磁盘使用情况

# 首先设置当前MS-DOS目录
mcd a:\

# 显示当前目录的磁盘使用情况
mdu

# 或直接指定路径
mdu a:\

输出示例:

1024    a:\
512     a:\DOS
256     a:\WINDOWS
128     a:\TEMP
1920    总计

示例2:显示特定目录的大小

# 显示A:驱动器上WINDOWS目录的大小
mdu a:\windows

# 显示多个目录的大小
mdu a:\windows a:\dos a:\temp

# 使用相对路径
mcd a:\
mdu windows system

示例3:仅显示总计大小

# 仅显示目录的总计大小,不显示子目录详情
mdu -s a:\windows

# 显示多个目录的总计大小
mdu -s a:\windows a:\dos

输出示例:

8192    a:\windows
2048    a:\dos

示例4:显示所有文件的大小

# 显示目录中所有文件的大小(包括普通文件)
mdu -a a:\windows

# 显示当前目录所有文件的大小
mdu -a

默认情况下,mdu只显示目录的大小。使用-a选项会同时显示所有文件的大小。

高级用法

示例5:使用不同单位显示大小

# 以KB为单位显示(默认)
mdu -k a:\

# 以MB为单位显示
mdu -m a:\

# 结合-s选项使用不同单位
mdu -sm a:\windows

示例6:排除特定文件或目录

# 排除所有.tmp文件
mdu -X "*.tmp" a:\

# 排除多个模式
mdu -X "*.tmp" -X "*.bak" a:\

# 排除指定目录
mdu -X "TEMP" a:\windows

示例7:详细模式输出

# 显示详细的处理信息
mdu -v a:\

# 结合其他选项使用详细模式
mdu -av a:\windows

实际应用场景

场景1:分析软盘空间使用情况
# 插入软盘后,分析各目录占用空间
mdu -s a:\*

# 找出占用空间最大的目录
mdu -s a:\* | sort -nr

# 详细分析WINDOWS目录
mdu a:\windows | sort -nr | head -10
场景2:监控MS-DOS磁盘空间使用
#!/bin/bash
# monitor_dos_space.sh - 监控MS-DOS磁盘空间使用

DRIVE="a:"
LOG_FILE="/var/log/dos_space_$(date +%Y%m%d).log"

echo "=== MS-DOS磁盘空间监控报告 $(date) ===" >> "$LOG_FILE"
echo "驱动器: $DRIVE" >> "$LOG_FILE"
echo "" >> "$LOG_FILE"

# 显示磁盘总使用情况
echo "总体使用情况:" >> "$LOG_FILE"
mdu -s "$DRIVE" >> "$LOG_FILE"
echo "" >> "$LOG_FILE"

# 显示前5个最大目录
echo "前5个最大目录:" >> "$LOG_FILE"
mdu -s "$DRIVE\\*" 2>/dev/null | sort -nr | head -5 >> "$LOG_FILE"
echo "" >> "$LOG_FILE"

echo "报告生成完成: $LOG_FILE"
场景3:清理前的空间分析
#!/bin/bash
# analyze_before_cleanup.sh - 清理前的空间分析

DRIVE="c:"
THRESHOLD=10240  # 10MB阈值,单位KB

echo "分析驱动器 $DRIVE 中大于 ${THRESHOLD}KB 的目录..."
echo ""

# 找出所有大于阈值的目录
mdu -s "$DRIVE\\*" 2>/dev/null | while read size dir; do
    if [[ "$size" =~ ^[0-9]+$ ]] && [ "$size" -gt "$THRESHOLD" ]; then
        echo "大目录: ${size}KB - $dir"

        # 显示目录内容详情(可选)
        mdu "$dir" | head -5
        echo ""
    fi
done

现代替代方案

使用挂载方法和Linux du命令

在现代Linux系统中,更常见的做法是挂载MS-DOS文件系统后使用标准的du命令:

# 挂载软盘
sudo mount -t msdos /dev/fd0 /mnt/floppy

# 使用du命令分析
du -h /mnt/floppy
du -sh /mnt/floppy/*
du -ah /mnt/floppy | sort -rh | head -20

# 卸载
sudo umount /mnt/floppy

优点:可以使用du命令的所有丰富选项,无需学习mdu的特殊语法。

mdu 与 du 命令功能比较

功能 mdu 命令 du 命令
递归统计 支持 支持
仅显示总计 -s 选项 -s--summarize
显示所有文件 -a 选项 -a--all
人类可读格式 有限支持(-k, -m) -h(完整支持)
排除模式 -X 选项 --exclude 选项
最大深度限制 不支持 --max-depth 选项
跨文件系统 不适用(只处理MS-DOS) -x 选项
访问方式 直接设备访问 需要挂载的文件系统

注意事项

  • 命令可用性:mdu不是标准Linux命令,需要安装mtools包
  • 文件系统限制:只能用于MS-DOS(FAT12/FAT16/FAT32)文件系统
  • 权限要求:需要读取权限访问设备文件(如/dev/fd0
  • 单位限制:mdu只支持KB和MB单位,不支持GB或自动选择合适单位
  • 符号链接:MS-DOS文件系统通常不支持符号链接,所以没有相关处理选项
  • 硬链接:MS-DOS文件系统不支持硬链接
  • 性能考虑:对于大型目录结构,mdu可能比挂载后使用du慢
  • 路径格式:必须使用MS-DOS路径格式,注意反斜杠转义

相关命令

  • du:Linux系统磁盘使用统计命令
  • mdir:列出MS-DOS目录内容(类似ls)
  • mcd:切换MS-DOS工作目录
  • mformat:格式化MS-DOS磁盘
  • mlabel:显示或修改MS-DOS卷标
  • mmd:创建MS-DOS目录
  • mrd:删除MS-DOS目录
  • df:显示文件系统磁盘空间使用情况
  • lsblk:列出块设备信息

常见问题与故障排除

# 1. 命令未找到错误
# 检查是否安装了mtools
which mtools
# 如果未安装,请安装mtools
sudo apt install mtools

# 2. 权限被拒绝
# 检查设备文件权限
ls -l /dev/fd0
# 将用户添加到相应组或使用sudo
sudo mdu a:\

# 3. 设备未找到
# 检查设备是否存在
ls -l /dev/fd*
# 检查mtools配置
cat ~/.mtoolsrc

# 4. 路径格式错误
# 使用正确的MS-DOS路径格式
mdu a:\\windows  # 注意转义反斜杠
# 或使用正斜杠
mdu a:/windows

# 5. 输出乱码
# MS-DOS使用不同的字符编码,可能需要设置locale
export LANG=C
mdu a:\\

# 6. 统计结果不准确
# MS-DOS使用簇分配,统计的可能是分配的空间而不是实际文件大小
# 这是FAT文件系统的特性,不是mdu的错误

技术细节

mdu命令的工作原理

mdu命令通过以下步骤工作:

  1. 解析MS-DOS路径并定位到相应设备
  2. 读取FAT文件系统的目录结构
  3. 递归遍历指定目录及其所有子目录
  4. 对于每个文件,读取其FAT表项以确定占用的簇数
  5. 将簇数转换为字节数(考虑簇大小,通常是512字节、1KB、2KB、4KB等)
  6. 累加所有文件的大小得到目录总大小
  7. 按照指定格式输出结果

由于FAT文件系统使用簇分配,文件实际占用的磁盘空间可能大于文件内容大小,特别是对于小文件。

历史背景与适用场景

mtools工具集(包括mdu)最初是为了在Unix系统上访问MS-DOS软盘而开发的。在早期,直接挂载DOS文件系统可能会遇到兼容性问题,mtools提供了无需挂载的直接访问方式。

现代适用场景:

  • 操作旧的DOS软盘或磁盘镜像
  • 批量脚本处理多个MS-DOS格式存储设备
  • 嵌入式系统或资源受限环境
  • 无需root权限访问可移动媒体
  • 恢复或分析旧的MS-DOS存储介质