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


4

在提取之前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来获取树。

Answers:


4

快速破解:

#!/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用于删除不相关的信息。至少在我的7-zip版本中1753for sed2for awk是正确的魔术数字。
  • sed将剥离第一个魔法53个字符(这是为了更好地处理空格awk)。
  • tac 用于反转输入(否则树将颠倒7z呈现列表的方式)。

它是直接的,但很古怪,添加逻辑以获得相同的花哨输出tree

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

编辑:添加sed到更好地处理空间。在那个注释中,一个纯sed版本与当前形式的上述脚本具有相同的输出:

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

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


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]}

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


1

您可以运行一个小的bash脚本来为您完成工作。因为我现在无法访问Linux并且没有足够的时间,所以我只能给你一个纲要。

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.