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
以获取树。
快速破解:
#!/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
在这里,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'
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)
如果在其中添加一些换行符,这可能是构建良好输出格式的最简单方法。
归档时间: |
|
查看次数: |
1413 次 |
最近记录: |