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
の全体的な構造がわからないからです。
抽出する前にdirツリーを印刷することは可能です。
├── 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
を実行してツリーを取得できます。
クイックハック:
#!/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
ここでは、sed
の53
とawk
の2
は、少なくとも私の7-Zipバージョンでは正しいマジックナンバーでした。sed
は最初の魔法の53文字を取り除きます(これはawk
のスペースの処理を改善するためです)。tac
は入力を逆にするために使用されます(そうしないと、7zがリストを表示する方法でツリーが逆さまになります)。tree
と同じ派手な出力を取得するロジックを追加するのは簡単ですが、風変わりです。
awk
とtail
の代わりに、tac
を使用して、1つのコマンドで行をフィルタリングおよび反転できますが、少し複雑になります。
EDIT:スペースをより適切に処理するために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]}
その中に改行を追加する場合は、Nice出力フォーマットを作成する最も簡単な方法です。
あなたはあなたのためにあなたの仕事をするために小さなbashスクリプトを実行することができます。私はLinuxにアクセスできず、現在十分な時間がないので、概要を説明することしかできません。
これにより、treeと同様の出力が得られるはずです。小さなC++プログラムを作成して、それを印刷することもできます。これは、より簡単できれいな場合があります。