Eu finalmente encontrei, era mais simples que eu imagino: 7z l -slt <nameof archive> | grep -c 'Path = [^/]*$'
.
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]*\)/\$(( + ))/'
tail
extrair a última linha; sed
extrai os números antes das palavras "arquivos" e "pastas". 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?
É 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.
Tags sparse-files shell-script 7z