Как распечатать 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++, чтобы распечатать ее для вас, что может быть проще или красивее.