Назад | Перейти на главную страницу

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

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

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

Вы можете использовать "разделить архив"функциональность"застегивать"сам использует"--split-size"вариант.

Из справочной страницы "zip" ("man zip"):

(...)

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

(...)

-s splitsize
--split-size splitsize

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

                zip -s 670m -r foo bar

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

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

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

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

(...)

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

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

(...)

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

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

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

$ unzip unsplit.zip

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

Вы получите несколько файлов:

archive.tar.gzaa

archive.tar.gzab

...

Что затем можно распаковать с помощью:

cat archive.tar.* | tar -xzvf -

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

Пример: Чтобы разделить Файл 5 ГБ в Файлы размером 1 ГБ для копирования на USB-накопитель FAT32 (имя файла "FIVE_GB_FILE.ISO")

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

zip -0 FIVE_GB_FILE.ZIP FIVE_GB_FILE.ISO

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

zip -s 1000m SPLIT_5GB_FILES FIVE_GB_FILE.ZIP

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

SPLIT_5GB_FILES.zip
SPLIT_5GB_FILES.Z01
SPLIT_5GB_FILES.Z02
SPLIT_5GB_FILES.Z03
SPLIT_5GB_FILES.Z04