O Linux determina o tamanho ZIP sem compressão

0

Eu gostaria de fazer um arquivo ZIP usando o comando zip . O arquivo zip conteria um grande número de diretórios contendo grandes números de subdiretórios, arquivos, etc.

Existe alguma maneira de calcular o tamanho final do arquivo ZIP, mas antes de fazer o zip real no disco?

Por exemplo: Calculando o tamanho final do arquivo ZIP para determinar se o ZIP caberá no contêiner de tamanho específico (não podemos executar na operação do disco nem no tmp, porque se ele não couber, a compactação falhará sem fornecer informações sobre o tamanho do arquivo)

    
por Jakub Pastuszuk 22.10.2018 / 00:02

3 respostas

3

Na página de manual do zip :

Streaming input and output. zip will also accept a single dash ("-") as the zip file name, in which case it will write the zip file to standard output, allowing the output to be piped to another program.

Então:

$ zip -r - foo | wc -c

Irá dizer-lhe o tamanho comprimido em bytes do diretório foo.

O 7z não pode gravar em stdout para arquivos zip.

A outra alternativa é criar um disco de memória e compactá-lo.

    
por 22.10.2018 / 04:31
2

Você pode compactar para StdOut e contar os bytes, mas AFAIK zip não zip para stdout (e nem 7z , o outro utilitário que pode produzir um formato ZIP) (*).

No Linux, você normalmente produz arquivos .tar.gz e a saída de utilitários para stdout se nenhum arquivo de saída for especificado:

# compute size
outputSize=$(tar -cz the_directories | wc -c)
# create file
tar -czf some.tar.gz the_directories

Observe que, em qualquer caso, você faz a compactação duas vezes, não é possível prever o tamanho da saída sem realizar a conversão.

(*) possivelmente devido ao fato de que você não pode decodificar um arquivo ZIP sem ver o final primeiro.

    
por 22.10.2018 / 00:31
0

Faça

tar  cf  >(wc -c)  <file_name_arguments>;  sleep 1
Em vez de gravar em um arquivo, tar irá gravar em um pipe para um comando wc -c , que relatará o número de bytes gravados nele. (Inclua qualquer tar das opções necessárias para fazer a compactação.) Isso usa a funcionalidade "substituição de processo" do bash. Use o sleep 1 porque, sem ele, seu shell emitirá seu próximo prompt de shell quando o comando tar terminar, e não esperará o comando wc terminar.

Se você não tem festa, você provavelmente pode realizar a mesma coisa com um pipe nomeado.

    
por 22.10.2018 / 00:28