在提取之前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
这里,53
forsed
和2
forawk
至少在我的 7-zip 版本中是正确的神奇数字。sed
将删除前 53 个神奇字符(这是为了更好地处理中的空格awk
)。tac
用于反转输入(否则树将会像 7z 呈现列表的方式一样颠倒)。
添加逻辑来获得相同的奇特输出很简单,但却很古怪tree
。
awk
可以用来在单个命令中过滤和反转行,而不是tail
and 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++ 程序来为你打印它,这可能更简单或更漂亮。