Como compactar arquivos com um limite de tamanho?

19

Eu tenho um script que zip arquivos de uma pasta. Quero garantir que o arquivo compactado não tenha mais de 10 MB. Se o tamanho for maior que 10 MB, ele deverá criar outro arquivo ZIP.

Existe algum comando (ou outro método) que possa ser usado para isso?

Vishnu
fonte
1
A pergunta tem a tag gzip, mas o texto se refere ao zip . Você pode esclarecer? (As respostas são divididas entre as abordagens baseadas nos diferentes formatos.)
Håkan Lindqvist
Não consigo adicionar zip à tag, por isso usei o gzip. Se você tem um método gzip que eu posso ajustar com esse problema, também posso usá-lo.
Vishnu

Respostas:

21

Você pode usar a funcionalidade " arquivo morto dividido " do próprio " zip " usando a opção " --split-size ".

Na página de manual "zip" (" man zip"):

(...)

Um uso de arquivos divididos é armazenar um arquivo grande em várias
mídias removíveis . Para um arquivo dividido com 20 arquivos separados, os arquivos são
nomeados normalmente (substitua ARQUIVO pelo nome do seu arquivo)
ARCHIVE.z01, ARCHIVE.z02, ..., ARCHIVE.z19, ARCHIVE.zip. Observe que o
último arquivo é o arquivo .zip.

(...)

-s splitsize
--split-size splitsize

O tamanho da divisão é um número opcionalmente seguido por um multiplicador.
Atualmente, o número deve ser um número inteiro.
Atualmente, o multiplicador pode ser um de k (kilobytes), m (megabytes), g (gigabytes)
ou t (terabytes). Como 64k é o tamanho mínimo da divisão, os números
sem multiplicadores são padronizados para megabytes. Por exemplo, para criar
um arquivo dividido chamado foo com o conteúdo do
diretório bar com divisões de 670 MB que podem ser úteis para gravar
em CDs, o comando:

                zip -s 670m -r foo bar

poderia ser usado.

Portanto, para criar um arquivo zip dividido , você pode fazer o seguinte (a opção " -r" é a opção "recursiva" para incluir subdiretórios do diretório):

$ zip -r -s 10m archive.zip directory/

Para descompactar o arquivo , a página de zipmanual " " explica que você deve usar a opção "-s 0`":

(...)

 zip -s 0 split.zip --out unsplit.zip

converterá um arquivo dividido em um arquivo único.

(...)

Portanto, você primeiro "desagrega" o arquivo ZIP usando a opção "-s 0":

$ zip -s 0 archive.zip --out unsplit.zip

... e depois descompacte o arquivo não dividido:

$ unzip unsplit.zip

ricmarques
fonte
6
tar -czvf - /path/to/files | split -b 10M - archive.tar.gz

Fornecerá vários arquivos:

archive.tar.gzaa

archive.tar.gzab

...

Que pode ser descompactado com:

cat archive.tar.* | tar -xzvf -
Henrik Carlqvist
fonte
2

Aqui está como eu fiz isso para um arquivo de 5 GB (dividido em 1 GB vs 10 MB, conforme solicitado pelo OP) ...

Exemplo: Para dividir um arquivo de 5 GB em arquivos de 1 GB para copiar para um USB FAT32 (nome do arquivo "FIVE_GB_FILE.ISO")

Etapa 1: compactar o arquivo (sem compactação, mesmo diretório que a origem)

zip -0 FIVE_GB_FILE.ZIP FIVE_GB_FILE.ISO

Etapa 2 : dividir o arquivo zip de 5 GB em arquivos zip de 1 GB

zip -s 1000m SPLIT_5GB_FILES FIVE_GB_FILE.ZIP

Voila ... você deve ter os seguintes arquivos de 1 GB (E o original E o zip da etapa 1)

SPLIT_5GB_FILES.zip
SPLIT_5GB_FILES.Z01
SPLIT_5GB_FILES.Z02
SPLIT_5GB_FILES.Z03
SPLIT_5GB_FILES.Z04
Jay Marm
fonte