web-dev-qa-db-ja.com

7Zipアーカイブのdirツリーを印刷する方法は?

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を実行してツリーを取得できます。

4
kev

クイックハック:

#!/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ここでは、sed53awk2は、少なくとも私の7-Zipバージョンでは正しいマジックナンバーでした。
  • sedは最初の魔法の53文字を取り除きます(これはawkのスペースの処理を改善するためです)。
  • tacは入力を逆にするために使用されます(そうしないと、7zがリストを表示する方法でツリーが逆さまになります)。

treeと同じ派手な出力を取得するロジックを追加するのは簡単ですが、風変わりです。

awktailの代わりに、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出力フォーマットを作成する最も簡単な方法です。

4

あなたはあなたのためにあなたの仕事をするために小さなbashスクリプトを実行することができます。私はLinuxにアクセスできず、現在十分な時間がないので、概要を説明することしかできません。

  • アーカイブの内容を一覧表示する
  • パスを抽出するには、splitまたは任意のコマンドを使用します
  • フォルダ名を1回出力
  • 見つけた「/」文字ごとに、出力をインデントします

これにより、treeと同様の出力が得られるはずです。小さなC++プログラムを作成して、それを印刷することもできます。これは、より簡単できれいな場合があります。

1
Andreas