Linux ncdu怎么导出目录扫描结果供离线查看
来源:17golang原创
时间:2026-10-13 21:16:15 158浏览 收藏
先确定:你要带走的是扫描报告,不是目录文件
在服务器上发现归档目录占用较大,希望断开连接后继续分析,可以让 ncdu 把扫描结果写入报告,再在本地使用 ncdu 打开。报告保存目录层级和大小等元数据,不携带文件正文,不能用它恢复原文件。扫描期间目录仍可能变化,因此也不应把它当成存储系统的原子快照。
本文以 ncdu 2.9 官方手册为命令基准。先记录扫描端和阅读端的版本,不要把发行版仓库里的旧版本直接当成最新版。项目入口可复制:
https://dev.yorhel.nl/ncdu
# 在两端分别执行,确认真实安装版本 ncdu --version ncdu --help
以下使用你有权读取的 /srv/archive 作为示例;请替换为真实目录。命令是说明示例,本文没有声称在你的服务器实测过。
版本变化:小写 -o 和大写 -O 不能混用
| 方案 | 版本注意事项 | 使用理由 |
|---|---|---|
| -o:普通 JSON | 官方格式文档说明此导入导出格式用于 ncdu 1.9 及以后版本;仍需考虑具体版本对新增字段的处理 | 跨环境沟通时先选明确的非压缩格式 |
| -O:二进制报告 | 2.6 引入,不应交给不支持该格式的旧程序 | 较大目录、多线程导出和低内存浏览 |
| -c -o:Zstandard 压缩 JSON | 2.7 引入透明读写支持 | 两端支持时减少报告体积 |
上述引入版本来自官方 2.x 变更记录。扩展名只是人的提示,不会把 JSON 变成二进制,也不会使旧阅读端突然支持压缩。升级时应同时记录格式与阅读端版本,不能仅替换文件名。

基础写法:把 JSON 放到扫描树以外
建议给每次扫描建一个独立报告目录,并放在目标树之外。这样不会把正在变大的导出文件算进自身扫描,也减少覆盖以前结果的可能。
# 下列长选项以2.9为基准;旧版本先查本机帮助
umask 077
report_dir=$(mktemp -d /var/tmp/ncdu-report.XXXXXX) || exit 1
# 明确忽略配置,并关闭JSON压缩,报告位置不在/srv/archive内
if ncdu --ignore-config --no-compress -0 -x -o "$report_dir/archive.json" /srv/archive; then
printf '报告位置:%s\n' "$report_dir/archive.json"
else
printf '导出失败,请保留现场检查权限或空间\n' >&2
exit 1
fi
这里不自动使用 sudo。授权不足时先确定是否本来就不允许读取某些目录,而不是为了凑齐报告扩大权限。-x 限定为目标目录所在文件系统;挂载在其下的其他文件系统不会计入这次范围。-0 适合非交互任务,但并不表示“安静结束就是所有目录完整”。读取失败和未纳入的挂载点都需要作为报告范围记录下来。
对于旧版本,使用本机支持的 -o 导出语法,不要照搬 --no-compress 等新选项。若需要进度,可在交互终端把 -0 换为 -1;需要观察非致命扫描错误时,2.9 手册指出 -2 的全屏扫描界面才提供相应反馈。不要把非交互定时任务硬改成全屏模式。
离线查看:传输报告文件,而非重新扫描路径
通过你已有的授权文件传输方式复制 archive.json 到阅读机,例如存为 /home/reader/reports/archive.json。读取时必须带 -f;直接执行 ncdu /srv/archive 是扫描阅读机自己的目录,不是打开服务器的旧结果。
# 阅读机:路径指向已经复制好的报告 ncdu --ignore-config -r -r -f /home/reader/reports/archive.json
2.9 的文件导入默认关闭刷新、删除和启动 shell;这里额外使用两次 -r 明确关闭删除与 shell,并忽略用户配置。不要为了“刷新报告”开启 --enable-refresh:离线报告中的同名路径不等于阅读机上的同一个对象。需要新结果时,应在原扫描端重新生成一份报告。

新格式怎么选:先照顾阅读端,再考虑体积
如果生产端和阅读端都支持 2.7 及以后相关选项,可以使用压缩 JSON。示例沿用前面同一 shell 中已创建的 report_dir;换终端执行时须自行设置为实际报告目录:
# 压缩JSON:不要与普通.json混淆 ncdu --ignore-config -0 -x -c -o "$report_dir/archive.json.zst" /srv/archive # 阅读端支持该格式时可直接导入 ncdu --ignore-config -r -r -f "$report_dir/archive.json.zst"
大型目录且两端均支持二进制格式时,可以采用 -O,并根据机器资源选择线程数:
# 2.9示例:二进制报告,线程数是示例而非性能承诺 ncdu --ignore-config -0 -x -t 2 -O "$report_dir/archive.ncdu" /srv/archive ncdu --ignore-config -r -r -f "$report_dir/archive.ncdu"
二进制自带压缩,适合避免大树整体载入内存;它不能用 -f - 从标准输入导入。JSON 则支持标准输入。不要凭扩展名判断能否走管道,也不建议把两个选择写成一条盲目通用的命令。
要分析所有者、权限和修改时间,可在导出与导入两端都加 -e。它不是读取文件内容的开关,代价是更多内存与报告体积;没有在导出阶段记录的扩展信息,导入时再加 -e 也无法补回来。参数细节以ncdu 官方手册为准。
迁移后的观察项与常见问题
一个可交接的报告至少应附带:扫描根目录、开始与结束时间、ncdu 版本、是否跨文件系统、排除条件、报告格式以及已知读取异常。大小展示也要说明是磁盘占用还是表观大小;比较两次报告时必须保持统计口径相同。关于 JSON 内目录和文件的字段含义,可参考官方 JSON 格式说明,不要把报告改写成自定义结构后还期待 ncdu 正常导入。
为什么服务器文件删除了,本地报告还显示?
报告不是实时查询。它反映扫描时保存的信息,后来删除、增长或移动的内容不会自动同步。重新扫描后以新报告替换分析依据即可,旧报告可按你的保留策略归档。
能导入就代表没有漏扫吗?
不能。成功解析只能说明格式可读取;权限限制、排除条件、-x 的文件系统边界以及扫描中发生的变化,都可能影响覆盖范围。观察异常标记并保存范围说明,比宣称“整盘完整”更准确。
报告能公开发给别人分析吗?
报告没有文件正文,但文件名和目录结构仍可能泄露项目、用户或业务信息。umask 077 只是限制本机新文件访问权限,不能代替传输授权与接收方权限管理。分享前应确定这些元数据允许披露。
迁移清单可以压缩成五件事:确认两端版本;选择可读格式;将报告置于扫描树之外;只读导入且不启用刷新;记录统计口径和缺失范围。满足这些边界,离线报告才是一份可解释的磁盘分析资料,而不是被误用的备份文件。
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
119 收藏
-
190 收藏
-
172 收藏
-
123 收藏
-
154 收藏
-
220 收藏
-
289 收藏
-
237 收藏
-
164 收藏
-
405 收藏
-
344 收藏
-
321 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习