Как распечатать dir дерево 7zip архива?

Перед извлечением 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 чтобы получить дерево.

2 ответа

Быстрый взлом:

#!/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 за sed а также 2 за awk были правильные магические числа на моей версии с 7 почтовыми индексами по крайней мере.
  • sed удалит первые магические 53 символа (это для лучшей обработки пробелов в awk).
  • tac используется для обратного ввода (иначе дерево было бы вверх ногами, как 7z представляет листинг).

Это просто, но странно, добавить логику, чтобы получить такой же причудливый вывод, как tree есть.

awk может использоваться для фильтрации и обращения строк в одной команде вместо tail а также tac, но это было бы немного более запутанным.

РЕДАКТИРОВАТЬ: Добавлено sed лучше обрабатывать пробелы. И на этой ноте, чистый sed версия с тем же выводом, что и вышеприведенный скрипт в его текущей форме:

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

но это не будет легко получить хороший результат от.


EDIT2: И немного Perl Golf!:-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]}

Если добавить несколько разрывов строк, это, вероятно, самый простой способ создать хорошее форматирование вывода.

Вы можете запустить небольшой скрипт bash, чтобы сделать свою работу за вас. Поскольку у меня нет доступа к Linux и сейчас не хватает времени, я могу только дать вам краткое изложение.

  • перечислить содержимое архива
  • Используйте split или любую другую команду по вашему выбору, чтобы извлечь путь
  • выведите имя папки один раз
  • для каждого символа "/" вы найдете отступ

Это должно дать вам вывод, похожий на дерево. Вы также можете написать небольшую программу на C++, чтобы распечатать ее для вас, что может быть проще или красивее.

Другие вопросы по тегам