Lendo as primeiras N linhas de cada membro de um arquivo zip

0

Existem 10 arquivos e eles são compactados em Ten.zip. Como ler as primeiras n linhas (digamos, 2 linhas) de todos os 10 arquivos em um arquivo zipado? Existe algum comando fácil para isso?

    
por Radhakrishnan Rk 07.02.2018 / 08:34

3 respostas

1

Não há um comando "fácil" porque o unzip não oferece essa funcionalidade nativamente. Você deve pedir para extrair alguns ou todos os arquivos e processá-los você mesmo. Aqui está outra maneira:

zipinfo -1 Ten.zip | while IFS= read -r filename
do 
  unzip -p Ten.zip "$filename" | sed 2q
done

A diferença aqui é usar zipinfo para listar o conteúdo do arquivo, um por linha; nós então lemos os nomes dos arquivos linha por linha e pedimos que unzip extraia o arquivo para a tela (com -p para que o nome do arquivo não seja impresso) e então canalize para sed imprime (por padrão), parando na linha 2.

Isso pode falhar se você tiver arquivos arquivados com novas linhas em seus nomes; você não faria isso, porque descompactar o nome do arquivo na extração:

$ touch file$'\n'name
$ zip foo.zip file*name
$ rm file*name
$ zipinfo -1 foo.zip
file^Jname
$ unzip foo.zip
Archive:  foo.zip
 extracting: filename
$ ls -lrt
...
filename
    
por 07.02.2018 / 17:56
0

Usando unzip e grep :

(Nota: Esta resposta tem como referência a resposta de @ RomanPerekhrest e um post aqui )

bash-3.2$ unzip -l ten.zip
Archive:  ten.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        6  02-07-2018 09:16   0.txt
        6  02-07-2018 09:16   1.txt
        6  02-07-2018 09:16   2.txt
        6  02-07-2018 09:16   3.txt
        6  02-07-2018 09:16   4.txt
        6  02-07-2018 09:16   5.txt
        6  02-07-2018 09:16   6.txt
        6  02-07-2018 09:16   7.txt
        6  02-07-2018 09:16   8.txt
        6  02-07-2018 09:16   9.txt
---------                     -------
       60                     10 files
bash-3.2$

Extraia o conteúdo dos arquivos compactados para stdout / screen:

bash-3.2$ unzip -c ten.zip | grep -A2 extracting
 extracting: 0.txt
0
0
--
 extracting: 1.txt
1
1
--
 extracting: 2.txt
2
2
--
 extracting: 3.txt
3
3
And so on..

Comando : unzip -c ten.zip | grep -A[n] extracting . Aqui, 'n' pode ser o número de linhas que o usuário deseja visualizar.

    
por 07.02.2018 / 16:28
0
Solução

unzip + awk :

Amostra da estrutura do arquivo 10xml.zip :

$ unzip -l 10xml.zip 
Archive:  10xml.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
       20  2018-02-07 11:20   home/osboxes/temp_files/1.xml
       20  2018-02-07 11:20   home/osboxes/temp_files/2.xml
       20  2018-02-07 11:20   home/osboxes/temp_files/3.xml
       20  2018-02-07 11:20   home/osboxes/temp_files/4.xml
       20  2018-02-07 11:20   home/osboxes/temp_files/5.xml
       20  2018-02-07 11:20   home/osboxes/temp_files/6.xml
       20  2018-02-07 11:20   home/osboxes/temp_files/7.xml
       20  2018-02-07 11:20   home/osboxes/temp_files/8.xml
       20  2018-02-07 11:20   home/osboxes/temp_files/9.xml
       21  2018-02-07 11:20   home/osboxes/temp_files/10.xml
---------                     -------
      201                     10 files
  • unzip -l <archive> - arquivar arquivos de arquivo (formato curto)

Extraindo as primeiras 2 linhas de cada arquivo no arquivo:

unzip -c 10xml.zip | awk -v n=2 'NR==1{ next }/^ +inflating:/{ n=NR+2; next }n && NR<=n'
  • unzip -c <archive> - extrai arquivos para stdout / screen. O nome de cada arquivo é impresso conforme é extraído.
por 07.02.2018 / 10:51