Hack rápido:
#!/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]
}'
Salvar como 7ztree
, use como
$ 7ztree archive.7z
jsloader
resource
gre
modules
NetworkHelper.jsm
CommonDialog.jsm
jsdebugger.jsm
CertUtils.jsm
DownloadPaths.jsm
FileUtils.jsm
source-editor-textarea.jsm
-
tail
é usado para remover informações irrelevantes.17
here,53
parased
e2
paraawk
foram os números mágicos corretos na minha versão 7-zip, pelo menos. -
sed
irá remover os primeiros 53 caracteres mágicos (isto é para melhorar a manipulação de espaços emawk
). -
tac
é usado para reverter a entrada (caso contrário, a árvore estaria de cabeça para baixo, da mesma forma que 7z apresenta a listagem).
É direto, mas peculiar, adicionar lógica para obter a mesma saída de fantasia que tree
tem.
awk
poderia ser usado para filtrar e inverter linhas em um único comando em vez de tail
e tac
, mas seria um pouco mais complicado.
EDITAR: Adicionada sed
para melhor lidar com espaços. E nessa nota, uma versão sed
pura com a mesma saída que o script acima em sua forma atual:
#!/bin/sh
7zr l ../testing.7z |\
tail -n +17 |\
tac |\
tail -n +3 |\
sed 's/.\{53\}//; s#[^/]*/# #g'
mas isso não será fácil de obter resultados mais agradáveis.
EDIT2: e alguns golfe 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]}
Se alguém adicionar algumas quebras de linha, provavelmente será a maneira mais fácil de criar uma boa formatação de saída.