拓冰建站拓冰建站
首页 / 资讯中心 / 正文

使用 jc 将 zipinfo 归档清单输出转换为 JSON:解析器原理与实战指南

开发工具【免费下载链接】jcCLI tool and python library that converts the output of popular command-line tools, file-types, and common strings to JSON, YAML, or Dictionaries. This allows piping of output to tools like jq and simplifying automation scripts.项目地址https://gitcode.com/gh_mirrors/jc/jc点击查看免费下载导读zipinfo是 Unix/Linux 上查看 ZIP 压缩包内部清单的经典命令但其输出是固定宽度的文本表格难以直接用于脚本处理与数据分析。jcJSON Convert项目提供的zipinfo解析器可将zipinfo archive的输出转换为结构化的 JSON 数组每个归档包含大小、条目数、压缩率等元信息以及逐文件的权限位、压缩方法、时间戳等明细字段。读完本文你将掌握zipinfo解析器的 CLI 与 Python 模块两种调用方式、完整的输出 Schema以及它在多归档、含空格路径等边界场景下的源码级处理原理。一、解析器定位与能力边界zipinfo解析器是 jc 内置的命令输出解析器之一官方定义在 docs/parsers/zipinfo.md其源码位于 jc/parsers/zipinfo.py。在使用前需要明确两个重要边界不支持任何zipinfo选项文档原文明确标注 Nozipinfooptions are supported即解析器只针对默认格式的输出生效若通过-1、-l、-t等选项改变了输出格式将无法正确解析兼容平台为 linux 与 darwin解析器元数据中compatible [linux, darwin]在 zipinfo.py 中声明其他平台调用时会输出兼容性警告除非传入quietTrue。该解析器由 Matt J 贡献版本 1.2属于command标签类解析器自动识别的 magic command 为zipinfo。二、CLI 用法把 zipinfo 输出变成 JSON2.1 管道方式$ zipinfo archive | jc --zipinfo这是最典型的用法将zipinfo命令的输出通过管道交给 jc--zipinfo指定解析器。以官方文档中的示例档案为例$ zipinfo log4j-core-2.16.0.jar | jc --zipinfo -p其中-p让 JSON 输出带缩进便于人工阅读输出结构如下节选[ { archive: log4j-core-2.16.0.jar, size: 1789565, size_unit: bytes, number_entries: 1218, number_files: 1218, bytes_uncompressed: 3974141, bytes_compressed: 1515455, percent_compressed: 61.9, files: [ { flags: -rw-r--r--, zipversion: 2.0, zipunder: unx, filesize: 19810, type: bl, method: defN, date: 21-Dec-12, time: 23:35, filename: META-INF/MANIFEST.MF }, ... ] } ]2.2 交互式输入方式$ jc zipinfo此时 jc 等待标准输入粘贴或键入zipinfo的输出后按 Ctrl-D 结束输入即输出解析后的 JSON。2.3 与 jq 联动由于输出已是合法 JSON可直接管道到jq做过滤与统计例如提取所有defNDeflate 压缩方法的文件列表或在自动化脚本中把归档元数据存入数据库、生成报告。三、Python 模块用法除了 CLIjc 同时是 Python 库可在代码中直接解析zipinfo输出import jc result jc.parse(zipinfo, zipinfo_command_output)zipinfo_command_output为包含zipinfo原始输出的字符串返回值是「字典列表」List of Dictionaries每个字典对应一个归档。注意返回的是 Python 对象而非 JSON 字符串需要序列化时可自行调用json.dumps()。四、输出 Schema 详解文档给出了完整的输出结构顶层是归档对象数组每个归档对象字段如下字段类型含义archivestring归档文件名档案路径sizeinteger归档文件本身的字节大小size_unitstring大小单位示例中为bytesnumber_entriesinteger归档中的条目总数number_filesinteger归档中的文件数bytes_uncompressedinteger全部条目解压后的字节总数bytes_compressedinteger全部条目压缩后的字节总数percent_compressedfloat压缩率百分比如 61.9 表示压缩了 61.9%filesarray逐条目的明细列表files数组中每个条目的字段字段类型含义flagsstring权限位如-rw-r--r--文件或drwxr-xr-x目录zipversionstring创建该条目所需的 ZIP 规范版本如2.0、2.1、3.0zipunderstring压缩程序所依赖的主机系统Unix 下为unxfilesizeinteger条目未压缩大小字节typestring文件类型标识详见下文-t列解读methodstring压缩方法如defNDeflate与storStore不压缩datestring条目最后修改日期格式如21-Dec-12timestring条目最后修改时间格式如23:35filenamestring归档内完整路径如META-INF/MANIFEST.MF对照 tests/fixtures/rhel-8/zipinfo.out 可验证原始文本中每行条目的 9 个字段恰好映射为上述 9 个键而flags的第一字符-/d区分文件与目录。五、源码级实现原理5.1 三段式文本切割从 zipinfo.py 的解析逻辑可以看出每个归档的原始输出被分为三部分处理首行Archive: name使用line.replace(Archive: , , 1)去掉前缀。注意只替换一次、且不按空格分割这是为了兼容路径中带空格的档案名源码注释明确说明 dont split on spaces for files/paths with spaces次行Zip file size: size unit, number of entries: n按空白分词后取出size、size_unit并去掉尾逗号与number_entries末行n files, u bytes uncompressed, c bytes compressed: p%取出number_files、bytes_uncompressed、bytes_compressed并将percent_compressed的尾部%剥离。中间的逐条目文本行则被补上一行表头flags zipversion zipunder filesize type method date time filename交给 jc 通用的jc.parsers.universal.simple_table_parse做固定列表格解析得到files数组。5.2 多归档分割zipinfo支持一次传入多个归档输出中每个归档之间以空行分隔末尾还有一行形如3 archives were successfully processed.的汇总。解析器在 zipinfo.py 中先删掉这行汇总再以空行为界把每个归档切成独立的行组最终每个归档生成一个顶层字典。这一点在 tests/fixtures/osx-10.14.6/zipinfo-multi.out 中有完整样例同时包含jc1.zip、testzip.zip、micro.zip三个归档对应的预期 JSON 见 tests/fixtures/osx-10.14.6/zipinfo-multi.json。5.3 类型转换原始文本中的数字都是字符串_process()阶段在 zipinfo.py 中统一处理bytes_compressed、bytes_uncompressed、number_entries、number_files、size、filesize通过jc.utils.convert_to_int转为整数percent_compressed通过jc.utils.convert_to_float转为浮点数归档级与files条目级都执行同样的转换逻辑。这保证了输出 Schema 中声明的integer/float类型在结果中真实生效而非保持字符串。5.4 空数据处理若传入空字符串jc.utils.has_data(data)判定无数据后直接返回[]对应测试test_zipinfo_nodata见 tests/test_zipinfo.py。六、边界场景与测试验证仓库在 tests/test_zipinfo.py 中提供了四类回归测试覆盖了解析器设计时考虑的主要边界测试场景输入夹具验证点无数据—空输入返回[]单归档RHEL 8tests/fixtures/rhel-8/zipinfo.out1218 条目的 jar 包完整解析结果与 tests/fixtures/rhel-8/zipinfo.json 一致多归档macOS 10.14.6tests/fixtures/osx-10.14.6/zipinfo-multi.out空行分割与汇总行剔除逻辑路径含空格tests/fixtures/rhel-8/zipinfo-space-in-name.out档案名path/to file/with spaces/...jar不被错误截断其中「路径含空格」用例直接对应 5.1 节中首行解析只替换一次、不按空格分割的实现细节可见文档、源码与测试三者相互印证。七、使用建议与限制保持默认输出格式不要给zipinfo传-1、-l、-t等改变排版/内容的选项否则解析结果会出错输出可继续加工拿到 JSON 后可进一步配合jq筛选大文件按filesize排序、统计压缩率异常条目或按method分组统计压缩方法使用情况类型语义number_entries与number_files在多数场景下数值相同但语义不同——前者是归档内全部条目含目录后者对应汇总行中的文件计数分析时按需取用平台前提解析器声明的兼容平台为 Linux 与 macOS跨平台脚本中建议先确认目标主机可用zipinfo且输出为默认格式。综上jc 的zipinfo解析器通过首行/次行/末行定位 通用表格解析 类型转换的组合把 Unix 生态中最常见的压缩包清单文本变成可直接查询、统计与落库的结构化数据是构建归档管理自动化脚本的实用基础组件。赞分享开发工具【免费下载链接】jcCLI tool and python library that converts the output of popular command-line tools, file-types, and common strings to JSON, YAML, or Dictionaries. This allows piping of output to tools like jq and simplifying automation scripts.项目地址https://gitcode.com/gh_mirrors/jc/jc点击查看免费下载相关推荐jc 解析器实战使用 jc --gpg 将 gpg --with-colons 输出转换为 JSONjc 解析器实战使用 jc gpg 将 gpg with colons 输出转换为 JSON 导读 本文介绍 jcJSON Convert项目中的 gpg开发工具OpenProject 如何按版本规划产品路线图RoadmapOpenProject 如何按版本规划产品路线图Roadmap OpenProject 的 Roadmap 是一个按版本Version汇总工作包Wo开发工具jc 解析器实战使用 jc --sfdisk 将 sfdisk 分区表输出转换为 JSONjc 解析器实战使用 jc sfdisk 将 sfdisk 分区表输出转换为 JSON 导读 jc 是一个把常用命令行工具输出、文件类型和通用字符串转换为 J开发工具上一篇GS Quant高盛开源量化金融工具包的完整使用指南下一篇rkdeveloptool 开源项目教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门