Como imprimir a pasta dir de um arquivo 7zip?

4

Antes de extrair archive.7z , eu sempre verifico o que está ao lado:

$ 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

Ele imprimirá uma mensagem longa, se archive.7z contiver muitos arquivos e diretórios.

Não é muito útil. Porque não consigo ver a estrutura geral de archive.7z .

É possível imprimir uma árvore dir antes de extraí-la.

├── jsloader
│   └── resource
│       └── gre
│           ├── components
│           └── modules
│               ├── devtools
│               ├── services-crypto
│               ├── services-sync
│               │   ├── engines
│               │   └── ext
│               └── tabview

Eu uso tree -d archive para obter a árvore depois de executar 7z x archive.7z -oarchive .

Se eu conseguir extrair apenas os diretórios de archive.7z ,
Eu posso correr tree -d archive ; rm -r archive para obter a árvore.

    
por kev 16.05.2012 / 08:30

2 respostas

4

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 para sed e 2 para awk 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 em awk ).
  • 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.

    
por 16.05.2012 / 13:42
1

Você pode executar um pequeno script bash para fazer o seu trabalho para você. Como não tenho acesso ao Linux e não tenho tempo suficiente agora, só posso lhe dar um resumo.

  • listar o conteúdo do arquivo
  • Use o comando split ou qualquer comando de sua escolha para extrair o caminho
  • imprima o nome da pasta uma vez
  • para cada caractere "/" encontrado, você recua sua saída

Isso deve fornecer uma saída semelhante à árvore. Você também pode escrever um pequeno programa C ++ para imprimir isso para você, que pode ser mais fácil ou mais bonito.

    
por 16.05.2012 / 09:39