mdu 命令是mtools工具集的一部分,用于显示MS-DOS文件系统中目录的磁盘使用情况。它类似于Linux系统中的du命令,但专门用于MS-DOS格式的存储设备,可以递归计算目录及其所有子目录和文件占用的磁盘空间。
a:\directory),du使用Linux路径格式mdu [选项] [MS-DOS目录路径]...
如果不指定目录路径,mdu会显示当前MS-DOS工作目录的磁盘使用情况。
| 选项 | 说明 |
|---|---|
-a 或 --all |
显示所有文件的大小,不仅仅是目录 |
-s 或 --summarize |
仅显示总计大小,不显示每个子目录的详细信息 |
-v 或 --verbose |
详细模式,显示更多信息 |
-X 或 --exclude |
排除匹配指定模式的文件或目录 |
-k |
以KB为单位显示大小(默认) |
-m |
以MB为单位显示大小 |
--help |
显示帮助信息 |
--version |
显示版本信息 |
# 在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
# 首先设置当前MS-DOS目录
mcd a:\
# 显示当前目录的磁盘使用情况
mdu
# 或直接指定路径
mdu a:\
输出示例:
1024 a:\
512 a:\DOS
256 a:\WINDOWS
128 a:\TEMP
1920 总计
# 显示A:驱动器上WINDOWS目录的大小
mdu a:\windows
# 显示多个目录的大小
mdu a:\windows a:\dos a:\temp
# 使用相对路径
mcd a:\
mdu windows system
# 仅显示目录的总计大小,不显示子目录详情
mdu -s a:\windows
# 显示多个目录的总计大小
mdu -s a:\windows a:\dos
输出示例:
8192 a:\windows
2048 a:\dos
# 显示目录中所有文件的大小(包括普通文件)
mdu -a a:\windows
# 显示当前目录所有文件的大小
mdu -a
默认情况下,mdu只显示目录的大小。使用-a选项会同时显示所有文件的大小。
# 以KB为单位显示(默认)
mdu -k a:\
# 以MB为单位显示
mdu -m a:\
# 结合-s选项使用不同单位
mdu -sm a:\windows
# 排除所有.tmp文件
mdu -X "*.tmp" a:\
# 排除多个模式
mdu -X "*.tmp" -X "*.bak" a:\
# 排除指定目录
mdu -X "TEMP" a:\windows
# 显示详细的处理信息
mdu -v a:\
# 结合其他选项使用详细模式
mdu -av a:\windows
# 插入软盘后,分析各目录占用空间
mdu -s a:\*
# 找出占用空间最大的目录
mdu -s a:\* | sort -nr
# 详细分析WINDOWS目录
mdu a:\windows | sort -nr | head -10
#!/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"
#!/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系统中,更常见的做法是挂载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 命令 |
|---|---|---|
| 递归统计 | 支持 | 支持 |
| 仅显示总计 | -s 选项 |
-s 或 --summarize |
| 显示所有文件 | -a 选项 |
-a 或 --all |
| 人类可读格式 | 有限支持(-k, -m) | -h(完整支持) |
| 排除模式 | -X 选项 |
--exclude 选项 |
| 最大深度限制 | 不支持 | --max-depth 选项 |
| 跨文件系统 | 不适用(只处理MS-DOS) | -x 选项 |
| 访问方式 | 直接设备访问 | 需要挂载的文件系统 |
/dev/fd0)# 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命令通过以下步骤工作:
由于FAT文件系统使用簇分配,文件实际占用的磁盘空间可能大于文件内容大小,特别是对于小文件。
mtools工具集(包括mdu)最初是为了在Unix系统上访问MS-DOS软盘而开发的。在早期,直接挂载DOS文件系统可能会遇到兼容性问题,mtools提供了无需挂载的直接访问方式。
现代适用场景: