登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  文章 >  软件教程

7-Zip 怎么只输出归档文件名并保留路径中的空格

来源:17golang原创

时间:2026-11-11 05:14:35 147浏览 收藏

如果只是想把 7-Zip 归档里的路径交给后续脚本,最容易踩的坑是把普通列表按空格切列。7z l -ba 会去掉表头和表尾,但正文仍是固定列宽;更稳妥的做法是使用 7z l -slt -ba,只提取每个条目的 Path = 字段。这样 docs/release notes final.txt 会作为一整行保留下来。

官方地址:https://7-zip.org/

本文只处理归档清单、裸输出和路径解析,不涉及解压覆盖策略。Windows 示例使用 7z.exe,macOS/Linux 示例把程序名换成 7zz 即可。

先从 7-Zip File Manager 确认归档入口

先打开 7-Zip File Manager,选择目标归档并确认中央列表能看到文件项。入口路径可以是“File → Open”,也可以直接把归档拖进窗口;关键是先确认归档本身可读,再把同一个路径交给命令行。

7-Zip 归档文件管理器中选中带空格路径的文件并准备使用 l -ba 的界面说明图
图1:7-Zip 归档入口与裸列表参数的操作示意图,不是运行截图。

在这个阶段只核对三件事:窗口标题对应目标归档、文件列表出现预期条目、路径中的空格没有被界面截成多个字段。确认后再进入命令行输出。

用 l -ba 去掉表头,但不要按空格切列

l 是列出归档内容,-ba 是 bare output,用来隐藏表头和表尾。它适合让输出更紧凑,但每一行仍可能包含日期、时间、属性、大小和路径等固定列。下面的命令可以先观察裸列表:

# -ba 只去掉表头表尾;归档路径整体加引号,避免外层路径中的空格被 Shell 拆开
7z.exe l -ba "D:\Archives\release bundle.7z"

不要把结果直接写成“按空格取第 6 列”。文件名本身可以包含空格,固定列中的连续空格也可能让简单的 split 或 tokens 方案失效。若只需要给人看,裸列表够用;若要交给脚本,继续使用结构化输出。

用 l -slt -ba 按 Path 字段提取文件名

-slt 会把每个条目展开为字段块,-ba 负责去掉额外的头尾信息。解析时只删除固定前缀 Path = ,不会触碰路径中间的空格。

# 逐条读取 -slt 字段块,保存 Path 和 Attributes,避免按空格切分文件名
$path = $null
$isDirectory = $false
$lines = & 7z.exe l -slt -ba "D:\Archives\release bundle.7z"

foreach ($line in $lines) {
    if ($line -eq '') {
        # 空行表示一个条目结束,只输出非目录项
        if ($path -and -not $isDirectory) { $path }
        $path = $null
        $isDirectory = $false
        continue
    }
    if ($line.StartsWith('Path = ')) {
        # 只去掉字段名前缀,路径内部的空格保持原样
        $path = $line.Substring(7)
        continue
    }
    if ($line.StartsWith('Attributes = ')) {
        # 目录属性含 D,后续不把目录当作文件名输出
        $isDirectory = $line -match 'D'
    }
}

# 处理输出末尾没有空行的最后一个条目
if ($path -and -not $isDirectory) { $path }

如果目录项也需要保留,可以去掉 $isDirectory 判断;如果只想快速得到所有 Path,也可以把结构化输出交给 awk:

# macOS/Linux 使用 7zz;只匹配 Path 字段,不按空格切列
7zz l -slt -ba "backup with spaces.7z" |
  awk '/^Path = / {sub(/^Path = /, ""); print}'
7-Zip 结构化列表中按 Path 字段提取并过滤目录后的文件项说明图
图2:按 Path 字段解析并排除目录项后的结果示意图,不是运行截图。

用可见状态验收输出

运行脚本后,把结果按下面的状态核对:

  • 输出中没有 7-Zip 的表头、表尾或字段名,只有一行一个文件路径。
  • docs/release notes final.txt 等带空格路径仍是一整行,没有被拆成多个字段。
  • 使用目录过滤脚本时,Attributes = D 的目录项不会出现在最终清单。
  • 如果归档文件名本身包含空格,命令行中的归档路径仍被一对引号包住。

这套判断能区分两个问题:-ba 负责减少展示噪声,-slt 和字段解析负责让脚本知道每个值的边界。不要把“输出看起来少了表头”误认为“输出已经适合按空格切列”。

常见问题

为什么用了 -ba,文件名还是不能直接 split?

因为 -ba 只隐藏表头和表尾,不会把固定宽度表格变成转义后的 CSV。路径中有空格时,应读取 -slt 的 Path = 字段。

为什么结果里还有目录?

归档清单同时描述文件和目录。解析 Attributes = ,把含 D 的条目过滤掉,就能只输出文件项;如果目录本身也是业务输入,则不要做这一步。

Windows 和 macOS/Linux 的命令是否一样?

参数组合相同,主要差别是程序名和管道工具:Windows 常用 7z.exe 与 PowerShell,macOS/Linux 的官方控制台程序使用 7zz,示例中的路径引号和字段提取思路不变。

最终可以记住一句话:给人看的列表用 l -ba,给脚本读取的文件名用 l -slt -ba,按字段前缀提取而不是按空格切分。

声明:本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>