- CLI
- 开发工具
- AI Agent
- 人工智能
- 包管理器
【免费下载链接】x-cmd
Posix Shell 工具库
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 |
%iused | inode 使用率 | 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 --csv | CSV 格式输出 |
x df --tsv | TSV 格式输出 |
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:
___x_cmd os name_判定操作系统,得到darwin或linux(其余系统归入 linux 分支);- 循环解析
-n/--numeric、-c/--csv、-t/--tsv、-r/--raw、--auto|--app,将fmt初始值auto覆盖为具体格式; - 动态拼出函数名
___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- 先把
mount的全部输出、一条分隔符行、df的输出拼成一个连续数据流; - awk 脚本以
in_df == 0状态解析 mount 行(Linux 格式按空格切分,取第 3 列挂载点、第 6 列挂载属性并去掉括号),建立mount_attr[挂载点] = 属性哈希; - 读到分隔符行后切换到
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/__linux | Linux 分支:auto/csv/tsv/raw/app、toybox 处理 |
| mod/df/lib/__darwin | macOS 分支:/bin/df -aYkh、11 列输出 |
| mod/df/lib/awk/share.awk | 表头列名公共定义 |
| mod/df/lib/awk/mount_linux.awk | Linux 版 mount/df 关联脚本(8 列) |
| mod/df/lib/awk/mount_mac.awk | macOS 版关联脚本(11 列) |
| mod/df/lib/awk/mount_toybox.awk | toybox 环境关联脚本 |
| adv/df/advise.jso | 帮助/补全元数据(含短选项定义) |
| mod/csv/lib/main | csv 模块子命令分发(TUI 与 tojson 等) |
参考
- 原生
df(1)手册页 - 原生
mount(8)手册页
- CLI
- 开发工具
- AI Agent
- 人工智能
- 包管理器
【免费下载链接】x-cmd
Posix Shell 工具库
相关推荐
duf:一个更友好的 df 替代工具——磁盘用量与剩余空间查看实战指南
duf:一个更友好的 df 替代工具——磁盘用量与剩余空间查看实战指南 导读 duf(Disk Usage/Free Utility)是一款用 Go 编写的跨平
CLIDysk:终极Linux磁盘空间管理工具,比df更强大的完整指南
Dysk:终极Linux磁盘空间管理工具,比df更强大的完整指南 在Linux系统管理中,磁盘空间管理是每个系统管理员和开发者都必须面对的重要任务。Dysk作为
磁盘空间分析:rof/rofi与df命令数据展示
磁盘空间分析:rof/rofi与df命令数据展示 系统磁盘使用概况可通过 df h 命令查看,当前根文件系统使用率为73%,数据卷挂载点 /data/web/d
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考