Jak spakować pliki z limitem rozmiaru?

19

Mam skrypt, który zipuje pliki z folderu. Chcę się upewnić, że skompresowany plik nie ma więcej niż 10 MB. Jeśli rozmiar jest większy niż 10 MB, powinien utworzyć kolejny plik ZIP.

Czy istnieje jakakolwiek komenda (lub inna metoda), której można użyć w tym celu?

Wisznu
źródło
1
Pytanie ma tag gzip, ale tekst odnosi się do zip , możesz to wyjaśnić? (Odpowiedzi są podzielone między podejścia oparte na różnych formatach.)
Håkan Lindqvist
Nie mogę dodać do tagu zip, dlatego użyłem gzip. Jeśli masz metodę gzip, którą mogę dopasować do tego problemu, też mogę tego użyć.
Wisznu

Odpowiedzi:

21

Możesz użyć funkcji „ dzielenia archiwum ” samego „ zip ” za pomocą opcji „ --split-size ”.

Ze strony „zip” („ man zip”):

(...)

Jednym z zastosowań podzielonych archiwów jest przechowywanie dużego archiwum na wielu
nośnikach wymiennych . W przypadku podzielonego archiwum zawierającego 20 podzielonych plików, pliki są zwykle
nazywane (zamień ARCHIWUM nazwą swojego archiwum)
ARCHIWUM.z01, ARCHIWUM.z02, ..., ARCHIWĘ.Z19, ARCHIWĘ.zip. Zauważ, że
ostatnim plikiem jest plik .zip.

(...)

-s splititsize - splits
-size splititsize

Rozmiar podziału to liczba, po której opcjonalnie następuje mnożnik.
Obecnie liczba musi być liczbą całkowitą. Mnożnik może
obecnie wynosić jeden z k (kilobajtów), m (megabajtów), g (gigabajtów)
lub t (terabajtów). Ponieważ 64k to minimalny rozmiar podziału, liczby
bez mnożników są domyślnie ustawione w megabajtach. Na przykład, aby
utworzyć podzielone archiwum o nazwie foo z zawartością
katalogu bar z podziałami 670 MB, które mogą być przydatne do nagrywania
na płytach CD, polecenie:

                zip -s 670m -r foo bar

może być użyty.

Aby utworzyć podzielone archiwum zip , możesz wykonać następujące czynności („ -r” to przełącznik „rekurencyjny” obejmujący podkatalogi katalogu):

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

Aby rozpakować plik , strona zippodręcznika „ ” wyjaśnia, że ​​należy użyć przełącznika „-s 0” ”:

(...)

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

skonwertuje podzielone archiwum na archiwum jednego pliku.

(...)

Tak więc najpierw „odznaczasz” plik ZIP za pomocą przełącznika „-s 0”:

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

... a następnie rozpakuj nieoznaczony plik:

$ unzip unsplit.zip

Ricmarques
źródło
6
tar -czvf - /path/to/files | split -b 10M - archive.tar.gz

Otrzymasz wiele plików:

archive.tar.gzaa

archive.tar.gzab

...

Które następnie można rozpakować za pomocą:

cat archive.tar.* | tar -xzvf -
Henrik Carlqvist
źródło
2

Oto, jak to zrobiłem dla pliku 5 GB (podzielony na 1 GB vs 10 MB, jak poprosił OP) ...

Przykład: Aby podzielić plik 5 GB na 1 GB, aby skopiować go na FAT32 USB (nazwa pliku „FIVE_GB_FILE.ISO”)

Krok 1: skompresuj plik (bez kompresji, ten sam katalog co źródło)

zip -0 FIVE_GB_FILE.ZIP FIVE_GB_FILE.ISO

Krok 2 : podziel plik zip 5 GB na pliki zip 1 GB

zip -s 1000m SPLIT_5GB_FILES FIVE_GB_FILE.ZIP

Voila ... powinieneś mieć następujące pliki 1GB (ORAZ oryginał ORAZ zip z kroku 1)

SPLIT_5GB_FILES.zip
SPLIT_5GB_FILES.Z01
SPLIT_5GB_FILES.Z02
SPLIT_5GB_FILES.Z03
SPLIT_5GB_FILES.Z04
Jay Marm
źródło