如何打印 7zip 档案的目录树?

如何打印 7zip 档案的目录树?

在提取之前archive.7z,我总是检查里面有什么:

$ 7z l archive.7z

...SKIP...

2010-01-01 00:00:00 .....        25856         7367  jsloader/resource/gre/modules/source-editor-textarea.jsm
2010-01-01 00:00:00 .....         4656         1669  jsloader/resource/gre/modules/FileUtils.jsm
2010-01-01 00:00:00 .....         1856          943  jsloader/resource/gre/modules/DownloadPaths.jsm
2010-01-01 00:00:00 .....         7096         2724  jsloader/resource/gre/modules/CertUtils.jsm
2010-01-01 00:00:00 .....          540          346  jsloader/resource/gre/modules/jsdebugger.jsm
2010-01-01 00:00:00 .....        12964         4225  jsloader/resource/gre/modules/CommonDialog.jsm
2010-01-01 00:00:00 .....         9692         3272  jsloader/resource/gre/modules/NetworkHelper.jsm
2010-01-01 00:00:00 .....        11252         3503  jsloader/resource/gre/modules/AutocompletePopup.jsm
------------------- ----- ------------ ------------  ------------------------
                              17928547      5269642  1489 files, 0 folders

archive.7z如果包含大量文件和目录,它将打印一条长消息。

它不是很有用。因为我看不到它的整体结构archive.7z

可以在提取目录树之前打印出来。

├── jsloader
│   └── resource
│       └── gre
│           ├── components
│           └── modules
│               ├── devtools
│               ├── services-crypto
│               ├── services-sync
│               │   ├── engines
│               │   └── ext
│               └── tabview

我习惯tree -d archive跑步后去拿树7z x archive.7z -oarchive

如果我只能提取的目录archive.7z
我就可以运行tree -d archive ; rm -r archive来获取树。

答案1

快速破解:

#!/bin/sh
7z l "${1}" |\
tail -n +17 |\
sed 's/.\{53\}//' |\
tac |\
awk 'NR>2 {
    n=split($6, a, "/")
    {for (i=1; i<n; i++)
        printf "   "
    }
    print a[n]
}'

另存为7ztree,使用为

$ 7ztree archive.7z
jsloader
   resource
      gre
         modules
            NetworkHelper.jsm
            CommonDialog.jsm
            jsdebugger.jsm
            CertUtils.jsm
            DownloadPaths.jsm
            FileUtils.jsm
            source-editor-textarea.jsm
  • tail用于删除不相关的信息。17这里,53forsed2forawk至少在我的 7-zip 版本中是正确的神奇数字。
  • sed将删除前 53 个神奇字符(这是为了更好地处理中的空格awk)。
  • tac用于反转输入(否则树将会像 7z 呈现列表的方式一样颠倒)。

添加逻辑来获得相同的奇特输出很简单,但却很古怪tree

awk可以用来在单个命令中过滤和反转行,而不是tailand tac,但它会更复杂一些。

编辑:添加sed以更好地处理空格。关于这一点,纯sed版本具有与上述脚本相同的输出,其当前形式如下:

#!/bin/sh
7zr l ../testing.7z |\
tail -n +17 |\
tac |\
tail -n +3 |\
sed 's/.\{53\}//; s#[^/]*/#   #g'

但这并不容易获得更好的输出。


编辑2:还有一些珀尔高尔夫:-D!

#!/usr/bin/perl
my @lines;
my $i=0;
while(<>) {next if ++$i<17; push @lines,substr $_,53}
for my $i (reverse 0..$#lines-2) {print ' 'x3x$lines[$i]=~tr#/##.$lines[$i]}

如果在其中添加一些换行符,这可能是构建良好输出格式的最简单方法。

答案2

您可以运行一个小的 bash 脚本来帮您完成工作。由于我现在无法使用 Linux,也没有足够的时间,所以我只能给您一个概述。

  • 列出档案内容
  • 使用 split 或您选择的任何命令来提取路径
  • 输出一次文件夹名称
  • 对于找到的每个“/”字符,都会缩进输出

这应该会给你一个类似于树的输出。你也可以编写一个小型 C++ 程序来为你打印它,这可能更简单或更漂亮。

相关内容