Как заархивировать или разархивировать файлы из терминала Linux

ZIP-файлы — это универсальный архив, обычно используемый в системах Windows, macOS и даже Linux. Вы можете создать zip-архив или распаковать файлы из него с помощью некоторых общих команд терминала Linux.

Формат файла сжатого архива ZIP

Благодаря преобладанию формата ZIP в области Windows, файлы ZIP, вероятно, являются наиболее распространенной формой сжатых архивов в мире.

Хотя файлы .tar.gz и tar.bz2 распространены в Linux, пользователи Windows, вероятно, отправят вам архив в формате ZIP. А если вы хотите заархивировать некоторые файлы и отправить их пользователю Windows, формат ZIP будет самым простым и наиболее совместимым решением для всех.

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

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

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

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

sudo dnf install perl-IO-Compress

команда установки zip для Fedora

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

sudo yum install perl-IO-Compress

Команда установки zip в Centos

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

Как создать ZIP-файл с помощью команды zip

Чтобы создать ZIP-файл, вам необходимо указать zip-архиву имя файла архива и какие файлы в него включить. Вам не нужно добавлять расширение «.zip» к имени архива, но это не повредит.

Чтобы создать файл с именем source_code.zip, содержащий все файлы исходного кода C и файлы заголовков в текущем каталоге, вы должны использовать эту команду:

zip source_code *.c *.h

zip команда в окне терминала

Каждый файл отображается по мере добавления. Отображается имя файла и степень сжатия, которое было достигнуто для этого файла.

  5 лучших клиентов IRC для использования в Linux

вывод команды zip в окне терминала

Если вы посмотрите на новый ZIP-архив, вы увидите, что расширение файла «.zip» было добавлено автоматически с помощью zip.

ls -l source_code.zip

ls в zip-архиве в окне терминала

Если вы не хотите видеть вывод zip при создании файла ZIP, используйте параметр -q (тихо).

zip -q source_code *.c *.h

-q тихая опция в окне терминала

Включение каталогов в ZIP-файлы

Чтобы включить подкаталоги в ZIP-файл, используйте параметр -r (рекурсивный) и укажите имя подкаталога в командной строке. Чтобы создать ZIP-файл, как раньше, а также включить подкаталог архива, используйте эту команду.

zip -r -q source_code archive/ *.c *.h

-r рекурсивная опция в окне терминала

Чтобы быть внимательным к человеку, который будет извлекать файлы из создаваемого вами ZIP-файла, часто бывает вежливо создавать ZIP-файлы с файлами внутри него, содержащимися в каталоге. Когда человек, получивший ZIP-файл, извлекает его, все файлы аккуратно помещаются в каталог на его компьютере.

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

zip -r -q source_code work/

архивирование рабочего каталога в окне терминала

Установка уровня сжатия

Вы можете установить степень сжатия, применяемого к файлам при их добавлении в ZIP-архив. Диапазон значений от 0 до 9, где 0 означает полное отсутствие сжатия. Чем выше степень сжатия, тем дольше создается ZIP-файл. Для файлов ZIP скромного размера разница во времени не является значительным штрафом. Но тогда для ZIP-файлов скромного размера сжатие по умолчанию (уровень 6), вероятно, в любом случае будет достаточно хорошим.

Чтобы zip использовал определенный уровень сжатия, передайте число в качестве параметра в командной строке со знаком «-», например:

zip -0 -r -q source_code work/

-0 параметр сжатия в окне терминала

Уровень сжатия по умолчанию — 6. Нет необходимости указывать параметр -6, но он не повредит, если вы это сделаете.

zip -r -q source_code work/

уровень сжатия 6 в окне терминала

Максимальный уровень сжатия — 9 уровень.

zip -9 -r -q source_code work/

-9 сжатие в окне терминала

При выборе файлов и каталогов, архивируемых здесь, разница между отсутствием сжатия (уровень 0) и сжатием по умолчанию (уровень 6) составляет 400 КБ. Разница между сжатием по умолчанию и самым высоким уровнем сжатия (уровень 9) составляет всего 4K.

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

Добавление паролей в ZIP-файлы

Добавить пароли в ZIP-файлы очень просто. Используйте параметр -e (шифрование), и вам будет предложено ввести пароль и повторно ввести его для проверки.

zip -e -r -q source_code work/

Добавление паролей к zip-файлам в окне терминала

Как распаковать ZIP-файл с помощью команды unzip

Чтобы извлечь файлы из ZIP-файла, используйте команду unzip и укажите имя ZIP-файла. Обратите внимание, что вам необходимо предоставить расширение «.zip».

unzip source_code.zip

команда unzip в окне терминала

По мере извлечения файлов они отображаются в окне терминала.

  Как установить и использовать диспетчер задач Nozbe в Linux

вывод unzip в окно терминала

Файлы ZIP не содержат сведений о владельце файла. У всех извлекаемых файлов владельцем установлен пользователь, который их извлекает.

Как и у zip, у unzip есть опция -q (тихо), поэтому вам не нужно видеть список файлов при извлечении файлов.

unzip -q source_code.zip

параметр unzip -q в окне терминала

Извлечение файлов в целевой каталог

Чтобы файлы были извлечены в конкретный каталог, используйте параметр -d (каталог) и укажите путь к каталогу, в который вы хотите распаковать архив.

unzip -q source_code.zip -d ./development

распаковать в целевой каталог в окне терминала

Извлечение файлов ZIP, защищенных паролем

Если ZIP-файл был создан с паролем, unzip запросит пароль. Если вы не укажете правильный пароль, распаковать файлы не удастся.

unzip -q source_code.zip

команду распаковать с паролем в окне терминала

Если вас не волнует, что ваш пароль будет виден другим людям или что он будет сохранен в вашей истории команд, вы можете указать пароль в командной строке с параметром -P (пароль). (Вы должны использовать заглавную букву «P.»)

unzip -P fifty.treacle.cutlass -q source_code.zip

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

Исключение файлов

Если вы не хотите извлекать определенный файл или группу файлов, используйте параметр -x (исключить). В этом примере мы хотим извлечь все файлы, кроме файлов с расширением «.h».

unzip -q source_code.zip -x *.h

опцию unzip exclude в окне терминала

Перезапись файлов

Предположим, вы распаковали архив, но по ошибке удалили несколько извлеченных файлов.

Быстрое решение этой проблемы — повторное извлечение файлов. Но если вы попытаетесь извлечь ZIP-файл в тот же каталог, что и раньше, unzip предложит вам принять решение о перезаписи файлов. Он будет ожидать один из следующих ответов.

Помимо ответа r (переименовать), эти ответы чувствительны к регистру.

y: Да, перезаписать этот файл
n: Нет, не перезаписывать этот файл
A: Все, перезаписать все файлы
N: Нет, не перезаписывать ни один из файлов
r: переименовать, извлечь этот файл, но дать ему новое имя. Вам будет предложено ввести новое имя.

перезаписывать подсказки в окне терминала

Чтобы принудительно разархивировать все существующие файлы, используйте параметр -o (перезапись).

unzip -o -q source_code.zip

опция перезаписи в окне терминала

Самый эффективный способ заменить отсутствующие файлы — это распаковать только те файлы в архиве, которых нет в целевом каталоге. Для этого используйте параметр -n (никогда не перезаписывать).

unzip -n source_code.zip

разархивировать с параметром -n никогда не перезаписывать в окне терминала

Заглянем внутрь ZIP-файла

Часто бывает полезно и поучительно просмотреть список файлов внутри ZIP-файла перед его извлечением. Вы можете сделать это с помощью опции -l (список архивов). Его пропускают меньше, чтобы сделать вывод управляемым.

unzip -l source_code.zip | less

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

На выходе отображаются каталоги и файлы в ZIP-файле, их длина, а также время и дата добавления в архив. Нажмите «q», чтобы выйти из меньшего.

  Как редактировать PPA в Linux Mint

вывод списка архива в окне терминала

Как мы увидим, есть и другие способы заглянуть внутрь ZIP-файла, которые предоставляют разные типы информации.

Добавьте пароль с помощью команды zipcloak

Если вы создали ZIP-файл, но забыли добавить пароль, что вы можете сделать? Вы можете быстро добавить пароль к ZIP-файлу с помощью команды zipcloak. Передайте имя ZIP-файла в командной строке. Вам будет предложено ввести пароль. Вам необходимо подтвердить пароль, введя его второй раз.

zipcloak source_code.zip

zipcloak в окне терминала

Просмотр сведений о файле с помощью команды zipdetails

Команда zipdetails покажет вам много информации о ZIP-файле. Единственный разумный способ справиться с объемом вывода, который может дать эта команда, — это передать его меньшим количеством каналов.

zipdetails source_code.zip | less

команда zipdetails в окне терминала

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

вывод zipdetails в окно терминала

Поиск внутри файла с помощью команды zipgrep

Команда zipgrep позволяет выполнять поиск в файлах ZIP-файла. В следующем примере мы хотим узнать, какие файлы в ZIP-файле содержат текст «keyval.h».

zipgrep keyval.h source_code.zip

команда zipgrep в окне терминала

Мы видим, что файлы slang.c и getval.c содержат строку «keyval.h». Мы также можем видеть, что есть две копии каждого из этих файлов в разных каталогах в ZIP-файле.

Просмотр информации с помощью команды zipinfo

Команда zipinfo дает вам еще один способ заглянуть внутрь ZIP-файла. Как и раньше, мы направляем вывод через less.

zipinfo source_code.zip | less

команда zipinfo в окне терминала

Слева направо вывод показывает:

Разрешения файла
Версия инструмента, используемого для создания ZIP-файла.
Исходный размер файла
Дескриптор файла (описанный ниже)
Метод сжатия (в данном случае дефляция)
Данные и отметка времени
Имя файла и любой каталог

Дескриптор файла состоит из двух символов. Первым символом будет буква «t» или «b» для обозначения текстового или двоичного файла. Если это заглавная буква, файл зашифрован. Второй символ может быть одним из четырех символов. Этот символ показывает, какой тип метаданных включен в этот файл: нет, расширенный локальный заголовок, «дополнительное поле» или и то, и другое.

-: Если ни один из них не существует, символ будет дефисом
l: если есть расширенный локальный заголовок, но нет дополнительного поля
x: если нет расширенного локального заголовка, но есть дополнительное поле
X: если есть расширенный локальный заголовок и есть дополнительное поле

вывод zipinfo в окно терминала

Разделите файл с помощью команды zipsplit

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

Параметр -n (размер) позволяет вам установить максимальный размер для каждого из новых файлов ZIP. В этом примере мы разделяем файл source_code.zip. Мы не хотим, чтобы размер новых ZIP-файлов превышал 100 КБ (102400 байт).

zipsplit -n 102400 source_code.zip

команда zipsplit в окне терминала

Выбранный вами размер не может быть меньше размера любого из файлов в ZIP-файле.

Используя эти команды, вы можете создавать свои собственные ZIP-файлы, распаковывать полученные ZIP-файлы и выполнять с ними различные другие операции, даже не выходя из терминала Linux.