☰
x-cmd x df:融合 df 与 mount 信息的增强磁盘空间查看工具(支持 TUI/TSV/CSV)
2026/10/14 14:55:45 网站建设 项目流程
  • CLI
  • 开发工具
  • AI Agent
  • 人工智能
  • 包管理器

【免费下载链接】x-cmd

Posix Shell 工具库

项目地址:https://gitcode.com/x-cmd/x-cmd
点击查看免费下载

x-cmd 是一个 POSIX shell 工具库,其df模块(mod/df/SKILL.md)提供了增强版磁盘空间查看命令x df:它将df与mount的输出合并为一份带文件系统类型和挂载属性的联合视图,并支持 TUI 交互应用、TSV、CSV、raw 四种输出格式,同时具备 TTY 自动检测能力。读完本文,你既能掌握x df全部命令参数的实际用法与数据过滤技巧,也能从源码层面理解它是如何用纯 shell + awk 管道完成 mount 与 df 输出关联的,从而在脚本和 Agent 场景中可靠地消费磁盘信息。

快速上手

x df的默认行为是"自动模式":在 TTY(终端交互环境)中启动交互式 TUI,在管道中输出 TSV:

# 交互式磁盘使用查看器(TTY 下的默认行为) x df # 管道时默认输出 TSV 格式 x df | cat

依赖前提:x df是 x-cmd 的模块,需先安装 x-cmd(参见 x-cmd 主技能文档)。模块入口定义在 mod/df/latest,通过xrc setmain ___x_cmd_df注册为x df可调用的主函数。

核心特性

  • 联合输出:合并df与mount命令的信息,一行同时看到设备、类型、容量、使用率和挂载属性;
  • 多格式输出:TSV、CSV、TUI 交互应用、raw 原始格式;
  • 跨平台:覆盖 Linux、macOS、Windows 场景;
  • 自动检测:TTY 中进入交互模式,被管道捕获时降级为 TSV 文本,天然适合脚本串联。

输出字段

Linux / Windows 字段

字段说明示例
Filesystem设备路径/dev/sda1
Type文件系统类型ext4、ntfs
Size总大小500G
Used已用空间200G
Avail可用空间300G
Use%使用率40%
Mounted_path挂载点/、/home
Mounted_attr挂载属性rw,relatime

macOS 额外字段

macOS 的df默认输出更多列,x df在原有 8 列之外额外保留:

字段说明示例
Capacity容量百分比40%
iused已用 inode 数1000000
ifree空闲 inode 数9000000
%iusedinode 使用率10%

这两组字段与源码中的 awk 实现严格对应:mount_linux.awk 打印 8 个字段(Filesystem~Mounted_attr),而 mount_mac.awk 打印 11 个字段(多了Capacity、iused、ifree、%iused,共 11 列输出)。

命令与选项

命令说明
x df自动模式:TTY→交互 TUI,管道→TSV
x df --app强制进入交互式 TUI 视图
x df --csvCSV 格式输出
x df --tsvTSV 格式输出
x df --raw输出系统原生命令的原始结果
x df --numeric以纯数字形式显示大小(不做单位换算)

根据 adv/df/advise.jso 中的帮助元数据,各长选项还配有短选项:--tsv可用-t,--csv可用-c,--raw可用-r,--numeric可用-n。这些选项的解析逻辑位于 mod/df/lib/main 的___x_cmd_df___exec函数中,采用标准的case逐项匹配并shift消耗参数,未知选项会中断解析并交由平台分支处理。

使用示例

基本用法

# 交互式查看(TTY 下直接运行) x df # TSV 格式 x df --tsv # CSV 格式 x df --csv

过滤与处理

# 查找大文件系统(>100GB) x df --tsv | awk -F'\t' 'NR>1 && $3 > 100' # 查看特定挂载点 x df --tsv | grep "/home" # 只取使用率 x df --tsv | awk -F'\t' '{print $1, $6}'

与数据模块组合

x df输出的是规整的 CSV/TSV,可以直接接入 x-cmd 的数据处理模块:

# 转成 JSON(借助 csv 模块) x df --csv | x csv tojson # 对磁盘数据做 SQL 风格查询 x df --csv | x csv sql "SELECT * WHERE Use% > 80"

x csv tojson子命令由 mod/csv/lib/main 分发(app|awk|tab|header|convert|static_tab|tojson|tojsonl|totsv|merge2),说明 CSV/TSV 是 x-cmd 各硬件信息模块之间的通用数据交换格式。

平台差异

Linux

  • 数据来源:df命令加上mount输出(对应文档中的df+/proc/mounts/mount);
  • 功能完整支持。

macOS

  • 数据来源:df与mount命令;
  • 额外提供 inode 信息(iused、ifree、%iused)。

从源码看,macOS 分支 mod/df/lib/__darwin 特意调用系统自带的/bin/df -aYkh(注释说明是为了确保使用 macOS 自带的 df),并按on分隔符解析mount输出得到挂载属性。

Windows

  • 文档描述使用wmic或 PowerShell 的Get-Volume获取磁盘信息,功能完整支持。
  • 需要注意源码中的路由逻辑:mod/df/lib/main 中通过___x_cmd os name_检测系统,darwin走 macOS 分支,其余情况一律按linux分支处理。也就是说从源码结构看,非 macOS 环境统一执行mount+df的联合管道,Windows 下的实际表现取决于所在 shell 环境中df/mount的可用性。

Toybox 环境的特殊处理

Linux 分支里有一个容易忽视的细节:___x_cmd_df___linux___raw会先调用___x_cmd_df___linux___istoybox判断(当前实现基于___x_cmd is_termux,即 Termux 环境推断为 toybox),因为 toybox 的df不支持-T(打印文件系统类型)。因此:

  • 标准环境:df -aTh(或--numeric时df -aT),并经过___x_cmd_df___raw_sort按首列排序;
  • toybox 环境:退化为df -ah(或df -a),且改用 mount_toybox.awk 关联挂载信息(其输出字段与 Linux 版一致,但Type列取自 df 输出本身而非 join)。

与原生 df 的对比

命令输出
df -h基础磁盘使用情况
mount挂载信息
x df带文件系统类型和挂载属性的联合视图
# 原生 df $ df -h Filesystem Size Used Avail Use% Mounted on /dev/sda1 500G 200G 300G 40% / # x df(联合了 mount 信息) $ x df --tsv Filesystem Type Size Used Avail Use% Mounted_path Mounted_attr /dev/sda1 ext4 500G 200G 300G 40% / rw,relatime

源码级实现解析

入口与参数解析

调用链为:mod/df/latest中___x_cmd_df()转发到___x_cmd_df___main(mod/df/lib/main)。main函数在未传参数时默认追加--exec,随后进入___x_cmd_df___exec:

  1. ___x_cmd os name_判定操作系统,得到darwin或linux(其余系统归入 linux 分支);
  2. 循环解析-n/--numeric、-c/--csv、-t/--tsv、-r/--raw、--auto|--app,将fmt初始值auto覆盖为具体格式;
  3. 动态拼出函数名___x_cmd_df___"${x_}"___"${fmt}"调用,例如 Linux 下 TSV 即___x_cmd_df___linux___tsv。

这就是"自动模式"的实现:auto分支(如 mod/df/lib/__linux 的___x_cmd_df___linux___auto)先探测___x_cmd_is_stdout2tty,是 TTY 就进入___app(TUI),否则回落到___tsv。

mount 与 df 的关联算法

xsv(csv/tsv 的统一实现)是整个模块的核心,其模式为"两段式流式管道 + awk 状态机":

{ ___x_cmd_cmds mount printf "%s\n" "$separator" # ---------X-CMD---------- ___x_cmd_df___linux___raw 2>/dev/null } | awk -v separator="$separator" -v format=tsv \ -f .../awk/share.awk -f .../awk/mount_linux.awk
  1. 先把mount的全部输出、一条分隔符行、df的输出拼成一个连续数据流;
  2. awk 脚本以in_df == 0状态解析 mount 行(Linux 格式按空格切分,取第 3 列挂载点、第 6 列挂载属性并去掉括号),建立mount_attr[挂载点] = 属性哈希;
  3. 读到分隔符行后切换到in_df == 1状态开始处理 df 输出:首行打印表头(列名Mounted_path、Mounted_attr由公共脚本 share.awk 统一定义),后续行按第 7 列(挂载点)查哈希,把挂载属性用双引号包裹后追加为第 8 列,避免属性中的逗号破坏 CSV 结构。

这种"文本流拼接 + 状态切换"的写法避免了临时文件和子命令往返,是典型的 POSIX shell + awk 风格实现。macOS 的 mount_mac.awk 则适配mount的另一种行格式(dev on /path (flags...),按on和\\(切分)。

TUI 模式的实现

--app(或 TTY 下的默认)最终把 CSV 输出交给 x-cmd 的 csv 模块渲染:

  • Linux:___x_cmd csv --app --clear --width "-,-,-,-,-,-,30,-"——第 7 列(Mounted_path)加宽到 30,其余列自适应;
  • macOS:___x_cmd csv --app --clear——列宽全部自适应。

--clear表示进入应用时先清屏。TUI 本身由 csv 模块提供,df模块只负责喂数据,体现了 x-cmd"数据模块与展示模块解耦"的设计。

raw 模式与排序

___x_cmd_df___raw_sort(定义在 mod/df/lib/main)读取首行原样打印(保留表头位置),其余行执行sort -k 1按设备列排序,保证 raw 输出在设备名维度上稳定有序,便于人工阅读和 diff。

相关文件索引

路径作用
mod/df/SKILL.md模块文档(本文主体来源)
mod/df/latest模块入口,注册x df主函数
mod/df/lib/main参数解析、OS 分发、raw 排序
mod/df/lib/__linuxLinux 分支:auto/csv/tsv/raw/app、toybox 处理
mod/df/lib/__darwinmacOS 分支:/bin/df -aYkh、11 列输出
mod/df/lib/awk/share.awk表头列名公共定义
mod/df/lib/awk/mount_linux.awkLinux 版 mount/df 关联脚本(8 列)
mod/df/lib/awk/mount_mac.awkmacOS 版关联脚本(11 列)
mod/df/lib/awk/mount_toybox.awktoybox 环境关联脚本
adv/df/advise.jso帮助/补全元数据(含短选项定义)
mod/csv/lib/maincsv 模块子命令分发(TUI 与 tojson 等)

参考

  • 原生df(1)手册页
  • 原生mount(8)手册页
  • CLI
  • 开发工具
  • AI Agent
  • 人工智能
  • 包管理器

【免费下载链接】x-cmd

Posix Shell 工具库

项目地址:https://gitcode.com/x-cmd/x-cmd
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询