Como saber quanto espaço um zip descompactado terá

22

Dada uma lista (realmente longa) de arquivos zip, como você pode dizer o tamanho deles uma vez descomprimido?

    
por Quora Feans 16.09.2015 / 01:21

4 respostas

36

Você pode fazer isso usando unzip -Zt zipname , que imprime um resumo diretamente sobre o conteúdo do arquivo, com o tamanho total. Aqui está um exemplo em sua saída:

unzip -Zt a.zip
1 file, 14956 bytes uncompressed, 3524 bytes compressed:  76.4%

Então, usando o awk, você pode extrair o número de bytes:

unzip -Zt a.zip | awk '{print $3}'
14956

Por fim, coloque-o em um loop for como na resposta de Tom:

total=0
for file in *.zip; do # or whichever files you want
    (( total += $(unzip -Zt $file |awk '{ print $3 }') ))
done
echo $total
    
por 16.09.2015 / 01:45
19

Se você digitar unzip -l <zipfile> , ela imprimirá uma lista de arquivos dentro do zip, com seus tamanhos descomprimidos e, em seguida, o tamanho total não compactado de todos eles.

Esta é uma saída legível por humanos, mas você pode obter um número legível por máquina usando unzip -l <zipfile> | tail -n1 | awk '{ print $1 }' .

Para obter um tamanho total:

total=0
for file in *.zip; do # or whichever files you want
    (( total += $(unzip -l $file | tail -n1 | awk '{ print $1 }') ))
done
echo $total
    
por 16.09.2015 / 01:32
15

unzip -l lista o tamanho de cada arquivo e imprime uma linha final com sua soma. Assim, você pode percorrer os arquivos zip e adicionar a saída de unzip -l "$zip" | awk 'END {print $1}' ou de unzip -Zt "$zip" | awk 'END {print $3}' . Para um loop de shell, unzip -Zt pode ser um pouco mais rápido:

total=0
for z in *.zip; do
  set $(unzip -Zt -- "$z")
  total=$((total + $3))
done

Isso informa apenas o tamanho total dos arquivos. Cada arquivo tem uma pequena sobrecarga: o espaço para armazenar seu nome, o espaço para armazenar alguns de seus metadados e possivelmente um pouco de espaço não utilizado, porque a maioria dos sistemas de arquivos aloca arquivos em blocos. Em sistemas de arquivos típicos, a sobrecarga pode ser de até alguns kilobytes. Não é exatamente previsível, porque a sobrecarga depende do tamanho do arquivo, da estrutura do diretório (devido à sobrecarga do diretório) e dos recursos do sistema de arquivos para mesclar vários arquivos pequenos no mesmo bloco.

Se a maioria dos arquivos tiver mais que alguns kilobytes, não se preocupe com isso. Mas se os arquivos forem muito pequenos, talvez você leve em conta a sobrecarga. Mais uma vez, o overhead depende do sistema de arquivos. No ext4, cada arquivo preenche um bloco inteiro (4kB por padrão na maioria dos sistemas). O script a seguir aproxima o tamanho total, arredondando cada arquivo até 4 kB e adicionando o comprimento do nome do arquivo mais alguns bytes.

for z in *.zip; do
  unzip -l -- "$z"
done | awk '
    $2 ~ /^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]$/ {total += ($1+4095)/4096*4096 + length($0)}
    END {print total}
'
    
por 16.09.2015 / 03:39
1

Olhe ma, sem loops!

Aqui está outra solução, que pode ser um pouco mais rápida, porque não usa loops, mas ainda recebe a mesma resposta.

unzip -l \*.zip|awk 'BEGIN{total=0}/        [0-9]+ files/{total=total+$1;}END{print "total bytes: "total}'

A parte "BEGIN {total = 0}" não é estritamente necessária.

    
por 18.09.2015 / 04:09