Dada uma lista (muito longa) de arquivos zip, como você pode saber o tamanho deles depois de descompactados?
Dada uma lista (muito longa) de arquivos zip, como você pode saber o tamanho deles depois de descompactados?
Respostas:
Você pode fazer isso usando o unzip -Zt zipname
que imprime um resumo diretamente sobre o conteúdo do arquivo, com tamanho total. Aqui está um exemplo em sua saída:
unzip -Zt a.zip
1 file, 14956 bytes uncompressed, 3524 bytes compressed: 76.4%
Em seguida, 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
Se você digitar unzip -l <zipfile>
, ele imprimirá uma lista de arquivos dentro do zip, com seus tamanhos não compactados, e 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
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 deunzip -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 possui 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 chegar a 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 do que alguns kilobytes, não se preocupe. Mas se os arquivos forem muito pequenos, convém levar em consideração a sobrecarga. Mais uma vez, a sobrecarga depende do sistema de arquivos. No ext4, cada arquivo preenche um bloco completo (4kB por padrão na maioria dos sistemas). O script a seguir aproxima o tamanho total, arredondando cada arquivo até 4kB 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}
'
df -i
), em comparação com XFS que pode alocar dinamicamente o máximo de espaço para inodes como ele precisa.)
Olha ma, sem loops!
Aqui está outra solução, que pode ser um pouco mais rápida, porque não usa loops, mas ainda chega à 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.