4

Прежде чем распаковать 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 ответа2

4

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

#!/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]}

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

1

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .