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

kev*_*kev 4 bash archiving tree 7-zip

在提取之前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
Run Code Online (Sandbox Code Playgroud)

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

它不是很有用。因为我看不到archive.7z.

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

??? jsloader
?   ??? resource
?       ??? gre
?           ??? components
?           ??? modules
?               ??? devtools
?               ??? services-crypto
?               ??? services-sync
?               ?   ??? engines
?               ?   ??? ext
?               ??? tabview
Run Code Online (Sandbox Code Playgroud)

我用来tree -d archive在运行后获取树7z x archive.7z -oarchive

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

Dan*_*son 5

快速破解:

#!/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]
}'
Run Code Online (Sandbox Code Playgroud)

另存为7ztree,用作

$ 7ztree archive.7z
jsloader
   resource
      gre
         modules
            NetworkHelper.jsm
            CommonDialog.jsm
            jsdebugger.jsm
            CertUtils.jsm
            DownloadPaths.jsm
            FileUtils.jsm
            source-editor-textarea.jsm
Run Code Online (Sandbox Code Playgroud)
  • 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'
Run Code Online (Sandbox Code Playgroud)

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


EDIT2:还有一些Perl 高尔夫球!:-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]}
Run Code Online (Sandbox Code Playgroud)

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