Como obter o número de arquivos em um 7z

0

Eu quero obter o número de arquivos (diretórios incluídos) contidos na raiz de um arquivo 7z, mas o comando 7z no Linux não traz uma maneira simples de obter apenas o número e anotá-lo.

Por exemplo, eu tenho o arquivo 7zarchive.7z que contém archive.tar e archive.gzip . Então, 7z l 7zarchive.7z imprime as seguintes linhas verbosas:

7-Zip 9.20  Copyright (c) 1999-2010 Igor Pavlov  2010-11-18
p7zip Version 9.20 (locale=fr_FR.UTF-8,Utf16=on,HugeFiles=on,2 CPUs)

Listing archive: 7zarchive.7z

--
Path = 7zarchive.7z
Type = 7z
Method = LZMA
Solid = +
Blocks = 1
Physical Size = 495
Headers Size = 184

    Date      Time    Attr         Size   Compressed  Name
------------------- ----- ------------ ------------  ------------------------
2016-03-14 22:43:10 ....A        20480          311  archive.tar
2016-03-14 23:04:01 ....A          163               archive.gzip
------------------- ----- ------------ ------------  ------------------------
                             20643          311  2 files, 0 folders

No canto inferior direito, você pode ver "2 arquivos, 0 pastas", portanto, quero obter a soma do número de pastas e do número de arquivos.

Para isso, eu tento o comando hediondo: bash 7z l 7z l *.7z | tail -1 | sed -e 's/.* \([0-9]*\) files\, \([0-9]*\) folders/ /' -e 's/\([0-9]*\) \([0-9]*\)/\$(( + ))/' | tail -1 | sed -e 's/.* \([0-9]*\) files\, \([0-9]*\) folders/ /' -e 's/\([0-9]*\) \([0-9]*\)/\$(( + ))/'

  1. tail extrair a última linha;
  2. A primeira expressão sed extrai os números antes das palavras "arquivos" e "pastas".
  3. A segunda expressão sed formate-a para ser impressa assim $(( <first number> + <second number>)) .

Então, eu realmente obtenho a saída $(( 2 + 0)) , mas eu quero que ela seja executada para obter apenas o resultado (2) e não o comando para calcular o resultado.

Então, existe uma maneira de fazer isso, ou, na lista, uma maneira mais simples de obter o número de arquivos contidos em um arquivo 7z?

    
por fauve 18.03.2016 / 00:21

2 respostas

0

Eu finalmente encontrei, era mais simples que eu imagino: 7z l -slt <nameof archive> | grep -c 'Path = [^/]*$' .

    
por 18.03.2016 / 00:32
0

É mais simples se você usar valores posicionais, por exemplo,

7z l 7zarchive.7z | tail -n 1 |awk '{ print $3 + $5; }'

dando o total de arquivos + pastas.

Na última linha

20643          311  2 files, 0 folders

$1 é "20643 ", $2 é "311" , $3 é "2" , $4 is "arquivos, ", $5 é "0" e $6 é "pastas" . Você pode torná-lo mais definido usando uma expressão regular para corresponder à linha.

    
por 18.03.2016 / 00:27