Как заархивировать файлы с ограничением размера?

19

У меня есть скрипт, который архивирует файлы из папки. Я хочу убедиться, что размер ZIP-файла не превышает 10 МБ. Если размер больше 10 МБ, он должен создать еще один ZIP-файл.

Есть ли какая-либо команда (или другой метод), который может быть использован для этого?

Вишну
источник
1
Вопрос имеет тег gzip, но текст относится к zip , вы можете уточнить? (Ответы разделены между подходами, основанными на разных форматах.)
Хокан Линдквист
Я не могу добавить zip в тег, поэтому я использовал gzip. Если у вас есть метод gzip, который я могу решить с этой проблемой, я тоже могу его использовать.
Вишну

Ответы:

21

Вы можете использовать функцию « разделить архив » самой « zip », используя опцию « --split-size ».

Из man-страницы "zip" (" man zip"):

(...)

Одно из применений разделенных архивов - хранение большого архива на нескольких сменных
носителях. Для разделенного архива с 20 разделенными файлами файлы обычно
называются (замените ARCHIVE на имя вашего архива) AR-
CHIVE.z01, ARCHIVE.z02, ..., ARCHIVE.z19, ARCHIVE.zip. Обратите внимание, что
последний файл - это файл .zip.

(...)

-s splitsize -
разделить размер

Размер разделения - это число, за которым может следовать множитель.
В настоящее время число должно быть целым числом. В
настоящее время множитель может быть одним из k (килобайт), m (мегабайт), g (гигабайт)
или t (терабайт). Поскольку 64k - это минимальный размер разбиения, числа
без множителей по умолчанию равны мегабайтам. Например, чтобы создать
разделенный архив с именем foo с содержимым
каталога bar с разделениями 670 МБ, который может быть полезен для записи
на компакт-диски, введите команду:

                zip -s 670m -r foo bar

может быть использован.

Итак, чтобы создать разделенный zip-архив , вы можете сделать следующее (« -r» - это «рекурсивный» переключатель для включения подкаталогов каталога):

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

Чтобы распаковать файл , zipстраница руководства " " объясняет, что вы должны использовать ключ "-s 0`":

(...)

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

преобразует разделенный архив в однофайловый архив.

(...)

Итак, вы сначала «расщепляете» ZIP-файл, используя ключ «-s 0»:

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

... а затем вы распаковываете неразделенный файл:

$ unzip unsplit.zip

ricmarques
источник
6
tar -czvf - /path/to/files | split -b 10M - archive.tar.gz

Даст вам ряд файлов:

archive.tar.gzaa

archive.tar.gzab

...

Который затем может быть распакован:

cat archive.tar.* | tar -xzvf -
Хенрик Карлквист
источник
2

Вот как я это сделал для файла объемом 5 ГБ (разделенного на 1 ГБ против 10 МБ, как спросил OP) ...

Пример: Чтобы разделить файл 5GB в 1 Гб файлов скопировать в FAT32 USB (имя файла «FIVE_GB_FILE.ISO»)

Шаг 1: заархивировать файл (без сжатия, тот же каталог, что и исходный код)

zip -0 FIVE_GB_FILE.ZIP FIVE_GB_FILE.ISO

Шаг 2 : разделите ZIP-файл объемом 5 ГБ на ZIP-файлы объемом 1 ГБ

zip -s 1000m SPLIT_5GB_FILES FIVE_GB_FILE.ZIP

Вуаля ... у вас должны быть следующие 1 ГБ файлы (И оригинал, и почтовый индекс из шага 1)

SPLIT_5GB_FILES.zip
SPLIT_5GB_FILES.Z01
SPLIT_5GB_FILES.Z02
SPLIT_5GB_FILES.Z03
SPLIT_5GB_FILES.Z04
Джей Марм
источник