Как создавать и распаковывать архивы zip в консоли Linux

Сжимая каталоги по ~1,3 ГБ, в каждом из которых по 1440 файлов JSON, я обнаружил 15-кратную разницу между размером архивов, сжатых с помощью tar на macOS или Raspbian 10 (Buster), и архивов, полученных при использовании библиотеки tarfile, встроенной в Python.

Часто используемые ключи команды tar

  1. -c – создать (create) новый архив
  2. -x – извлечь (extract) файлы из архива
  3. –delete – удалить (delete) файлы из архива
  4. -r – добавить (append) файлы в существующий архив
  5. -A – добавить (append) tar-файлы в существующий архив
  6. -t – список файлов в архиве (содержимое архива)
  7. -u – обновить (update) архив
  8. -d – операция сравнения архива с заданной файловой системой
  9. -z – обработка архива с помощью Примеры использования gzip и gunzip. Сжатие или разжатие, в зависимости от комбинации сопутствующих ключей -c или -x.
  10. -j – обработка архива с помощью bzip2. Сжатие или разжатие, в зависимости от комбинации сопутствующих ключей -c или -x.

tar запускается с обязательным указанием одного из основных действий, самые распространенные из которых — создание и распаковка архивов, далее задаются прочие параметры, зависящие от конкретной операции.

Наиболее общее использование tar заключается в распаковке и разархивировании пакета, загруженного с веб- или ftp-сайта. Большинство файлов имеют расширение Довольно часто их называют “tarball”'ами. Это означает несколько файлов, заархивированных tar'ом, а затем сжатых gzip'ом. Вы также можете встретить файлы .tar.Z. По сути это то же самое, однако встречаются они в основном на старых системах Unix.

Кроме того вы можете натолкнуться на файлы В таком виде распространяются исходные тексты ядра, поскольку так они занимают меньше места для загрузки. Как вы уже наверное догадались, это файлы, заархивированные tar'ом и сжатые bzip'ом.

Вы можете извлечь все файлы из такого архива, воспользовавшись tar'ом с несколькими опциями командной строки. Разархивирование тарбола выполняется с помощью опции -z, которая означает, что сначала файл должен быть пропущен через gunzip, а уже потом распакован. Наиболее общий метод распаковки тарболов:

% tar -xvzf

Здесь довольно много опций. Что же они означают? Опция -x означает извлечение. Это важно, поскольку она сообщает tar'у, что именно нужно сделать со входным файлом. В данном случае он будет снова разбит на файлы, из которых он был “слеплен”. Опция -v означает включение подробного режима. При этом на экран будут выведены названия всех извлекаемых из архива файлов. Неплохо было бы использовать эту опцию, чтобы распаковка не выглядела слишком скучно. Вы также можете использовать -vv, чтобы вывод был ещё более подробным и вы получили ещё больше информации об извлекаемых файлах. Опция -z сообщает tar'у о том, что нужно сначала пропустить через gunzip. И, наконец, опция -f сообщает tar'у, что следующая строка в командной строке — это файл, с которым надо работать.

Читайте также:  Команда Uname в Linux

Существует несколько способов записи этой же команды. На старых системах, на которых отсутствует подходящая копия GNU tar, вы можете увидеть следующую запись этой же команды:

% gunzip | tar -xvf —

В этой команде файл сначала распаковывается, а результат отправляется в tar. Т.к. gzip по умолчанию записывает выходные данные на стандартный вывод, эта команда будет записывать распакованный файл на стандартный вывод. Затем конвейер перенаправляет этот поток в tar для распаковки. Знак “-” означает, что данные берутся со стандартного входа. Таким образом команда разархивирует поток данных, полученный из gzip, и запишет его на диск.

Другим способом записи первоначальной команды является убирание знака “-” перед опциями:

% tar xvzf

Также вы можете натолкнуться на bzip'нутый архив. Версия tar, представленная в Slackware Linux, может работать с ними точно так же, как и с gzip'нутыми архивами. Просто вместо опции -z вам нужно использовать -j:

% tar -xvjf

Учтите, что tar будет сохранять извлечённые из архива файлы в текущий каталог. Поэтому, если у вас в /tmp есть архив, который вы хотите распаковать в свой домашний каталог, у вас есть несколько вариантов. Первый — архив можно переместить в ваш домашний каталог, а затем развернуть его с помощью tar. Второй — вы можете указать путь к архиву в командной строке. Третий — вы можете использовать опцию -C, чтобы разархивировать тарбол в указанный после этой опции каталог.

% cd $HOME % cp /tmp/ . % tar -xvzf

% cd $HOME % tar -xvzf /tmp/

% cd / % tar -xvzf /tmp/ -C $HOME

Все приведенные выше записи являются эквивалентными. В каждой из них архив разворачивается в ваш домашний каталог, а исходный сжатый архив остаётся на месте.

Ответ

Краткий ответ: да, tarlib в Python можно использовать для сжатия данных; по сравнению с BSD-реализацией tar ничем жертвовать не приходится.

Основная проблема: сортировка

Думаю, что главная проблема в том, что BSD- и GNU-версии tar без опций сортировки добавляют файлы в архив в неопределенном порядке.

В GNU tar есть параметр —sort:

Сортирует содержимое директории в соответствии с определенным порядком ORDER, который может быть none, name или inode.

По умолчанию —sort=none — файлы добавляются в архив в том порядке, в котором их возвращает операционная система.

Тестирование GNU tar

Перед проведением испытаний я установил GNU tar на Mac:

brew install gnu-tar

А потом за’tar’ил тот же каталог, но с опцией —sort:

gtar —sort=’name’ -cJf /Users/user/Desktop/temp/tar/2021-03-11

Размер архива составляет 1,5 МБ — такой же, как у архива, полученного с помощью Python-библиотеки.

Конкатенация в отсортированном порядке

Эффект, который сортировка оказывает на конечный размер архива, еще лучше заметен при конкатенации JSON-файлов, предварительно отсортированных по названию (в его начале идет время создания — unixtime), а затем заархивированных с помощью BSD tar:

cat *.json > tar cJf

Размер архива также равен 1,5 МБ.

Сортировка в Python-библиотеке tarfile

Наконец, документация к функции в Python подтверждает, что библиотека tarfile в Python по умолчанию сортирует файлы:

По умолчанию директории добавляются рекурсивно. Этого можно избежать, установив recursive в False. Рекурсия добавляет записи в отсортированном порядке.

Почему сортировка имеет значение

Думаю, что причина, по которой сортировка оказывает столь значительно влияние на размер архива, в моем случае состоит в следующем:

JSON-файлы содержат местоположения сотен транспортных средств. Эти местоположения считываются ежеминутно, но только некоторые из них меняются от минуты к минуте.

В результате сортировки по имени рядом оказываются файлы, мало отличающиеся друг от друга. Судя по всему, это весьма благоприятно сказывается на эффективности сжатия.

zip, unzip и другие утилиты

Возможно, вы уже знаете, что Linux и Unix-подобные операционные системы, такие как macOS, имеют инструменты, позволяющие создавать ZIP-файлы и извлекать из них файлы, называемые zip и unzip . Но есть целый ряд связанных утилит, таких как zipcloak , zipdetails, zipsplit и zipinfo.

Читайте также:  Как примонтировать «флешку» в Linux

Мы проверили некоторые дистрибутивы Linux, чтобы увидеть, включают ли они эти утилиты в стандартную установку. Все утилиты присутствовали в Ubuntu , и Они также присутствовали в Манджаро Fedora 29 включала zip и unzip , но ни одну из других утилит, и это также относится к CentOS.

Чтобы установить недостающие элементы в Fedora 29, используйте следующую команду:

sudo dnf install perl-IO-Compress

Чтобы установить недостающие элементы в CentOS 7, используйте следующую команду:

sudo yum install perl-IO-Compress

Если какая-либо из утилит zip отсутствует в дистрибутиве Linux, который не был упомянут выше, используйте инструмент управления пакетами этого дистрибутива Linux для установки необходимого пакета.

Основные ключи команды 7Z

  • -t: тип архива, по умолчанию создаются файлы в формате 7z. Примеры, -tzip, -tgz
  • -ssw: включить файл в архив, даже если он в данный момент используется
  • -mx: уровень компрессии (0 — без компрессии-быстро, 9 -самая большая компрессия-медленно)
    • -mx0 — без компрессии
    • -mx1 — очень быстрая компрессия
    • ——
    • -mx9 — ультра компрессия
  • -p: пароль для архива
  • -o: задает директорию, например, в которую будут распакованы файлы
  • -sdel: удалить файлы после создания архива
  • -sfx: создание самораспаковывающегося sfx-архива
  • -v: разбивать архив на тома,  (b — байты, k — килобайты, m — мегобайты, g — гигабайты), например: -v256m
  • -y: утвердительно ответить на все вопросы системы
  • -x: исключить файлы или папки из архива

Посмотреть все команды 7Z можно командой:

$man 7z

Чтобы посмотреть полную документацию(Англ.):

file:///usr/share/doc/p7zip-full/DOCS/MANUAL/

Исключить каталоги или файлы при создании архива

Это очень полезно при резервном копировании ваших данных. Вы можете исключить несущественные файлы или каталоги из вашей копии. Тут потребуется ключ -exclude. Например, вы хотите создать архив вашей домашней директории, но исключить загрузки, документы, изображения, музыку.

Выглядит это так:

tar czvf /home/sk —exclude=/home/sk/Downloads —exclude=/home/sk/Documents —exclude=/home/sk/Pictures —exclude=/home/sk/Music

Приведенная выше команда создаст сжатый архив моего каталога $HOME, исключая папки Downloads, Documents, Pictures и Music. Чтобы создать архив bzip, замените z на j и используйте расширение .tbz в примере.