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
Чтобы установить недостающие элементы в CentOS 7, используйте следующую команду:
sudo yum install perl-IO-Compress
Если какая-либо из утилит zip отсутствует в дистрибутиве Linux, который не был упомянут выше, используйте инструмент управления пакетами этого дистрибутива Linux для установки необходимого пакета.
Как создать ZIP-файл с помощью команды zip
Чтобы создать ZIP-файл, необходимо указать zip
имя файла архива и какие файлы включить в него. Вам не нужно добавлять расширение «.zip» к имени архива, но это не повредит.
Чтобы создать файл с именем source_code.zip содержащий все файлы исходного кода C и заголовочные файлы в текущем каталоге, вы должны использовать эту команду:
zip source_code *.c *.h
Каждый файл указан как добавленный. Отображается имя файла и степень сжатия, достигнутая в этом файле.
Если вы посмотрите на новый ZIP-архив, то увидите, что расширение «.zip» было автоматически добавлено zip.
ls -l source_code.zip
Если вы не хотите видеть вывод из zip при создании ZIP-файла, используйте параметр -q
(quiet).
zip -q source_code *.c *.h
Включение каталогов в ZIP-файлы
Чтобы включить подкаталоги в ZIP-файл, используйте параметр -r
(рекурсивный) и укажите имя подкаталога в командной строке. Чтобы создать ZIP-файл, как и раньше, а также включить подкаталог архива, используйте эту команду.
zip -r -q source_code archive/ *.c *.h
Чтобы быть внимательным к человеку, который будет извлекать файлы из создаваемого вами ZIP-файла, часто вежливо создавать ZIP-файлы с файлами внутри них, содержащимися в каталоге. Когда человек, получивший ZIP-файл, извлекает его, все файлы аккуратно помещаются в каталог на своем компьютере.
В следующей команде мы собираемся заархивировать work каталог и все подкаталоги. Обратите внимание, что эта команда выполняется из родительского каталога work папки.
zip -r -q source_code work/
Установка уровня сжатия
Вы можете установить степень сжатия файлов при их добавлении в ZIP-архив. Диапазон составляет от 0 до 9, где 0 вообще не компрессирует. Чем выше степень сжатия, тем больше времени требуется для создания файла ZIP. Для ZIP-файлов небольшого размера разница во времени не является существенным штрафом. Но тогда, для ZIP-файлов небольшого размера, сжатие по умолчанию (уровень 6), вероятно, достаточно хорошо в любом случае.
Чтобы заставить zip использовать определенный уровень сжатия, передайте число в качестве параметра в командной строке с помощью «-», например:
zip -0 -r -q source_code work/
Уровень сжатия по умолчанию равен 6. Нет необходимости -6 опцию -6 , но это не принесет вреда.
zip -r -q source_code work/
Максимальный уровень сжатия — уровень 9.
zip -9 -r -q source_code work/
При выборе файлов и каталогов, которые здесь архивируются, разница между отсутствием сжатия (уровень 0) и сжатием по умолчанию (уровень 6) составляет 400 КБ. Разница между сжатием по умолчанию и самым высоким уровнем сжатия (уровень 9) составляет всего 4K.
Это может показаться незначительным, но для архивов, содержащих сотни или даже тысячи файлов, небольшое количество дополнительного сжатия на файл может привести к экономии места.
Добавление паролей к ZIP-файлам
Добавить пароли к ZIP-файлам легко. Используйте параметр -e
(зашифровать), и вам будет предложено ввести пароль и повторно ввести его для проверки.
zip -e -r -q source_code work/
Как распаковать ZIP-файл с помощью команды unzip
Чтобы извлечь файлы из ZIP-файла, используйте команду unzip и укажите имя ZIP-файла. Обратите внимание, что вам нужно предоставить расширение «.zip».
unzip source_code.zip
По мере извлечения файлов они отображаются в окне терминала.
ZIP-файлы не содержат информации о владельце файла. Все извлеченные файлы имеют владельца, назначенного пользователю, который их извлекает.
Как и в zip , у unzip есть опция -q
(quiet), поэтому вам не нужно видеть список файлов, когда файлы извлекаются.
unzip -q source_code.zip
Извлечение файлов в целевой каталог
Чтобы файлы были извлечены в определенном каталоге, используйте опцию -d
(directory) и укажите путь к каталогу, в который вы хотите извлечь архив.
unzip -q source_code.zip -d ./development
Извлечение защищенных паролем ZIP-файлов
Если ZIP-файл был создан с паролем, unzip попросит вас указать пароль. Если вы не введете правильный пароль, 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
Перезапись файлов
Предположим, вы распаковали архив, но по ошибке удалили несколько извлеченных файлов.
Быстрое решение этой проблемы — извлечь файлы еще раз. Но если вы попытаетесь извлечь ZIP-файл из той же директории, что и раньше, unzip предложит вам принять решение относительно перезаписи файлов. Ожидается один из следующих ответов.
Помимо ответа r
(переименование), эти ответы чувствительны к регистру.
- y: да, переписать этот файл
- n: нет, не перезаписывать этот файл
- A: Все, переписать все файлы
- N: Нет, перезаписать ни один из файлов
- r: переименовать, распаковать этот файл, но дать ему новое имя. Вам будет предложено ввести новое имя.
Чтобы заставить unzip перезаписывать любые существующие файлы, используйте опцию -o
(перезапись).
unzip -o -q source_code.zip
Наиболее эффективный способ заменить отсутствующие файлы — unzip только те файлы в архиве, которые не находятся в целевом каталоге. Для этого используйте параметр -n
(никогда не перезаписывать).
unzip -n source_code.zip
Глядя внутрь ZIP-файла
Часто полезно и поучительно видеть список файлов внутри ZIP-файла перед его извлечением. Вы можете сделать это с опцией -l
(архив списка). Это запускает less чтобы сделать вывод управляемым.
unzip -l source_code.zip | less
Вывод показывает каталоги и файлы в ZIP-файле, их длину и время и дату, когда они были добавлены в архив. Нажмите «q», чтобы выйти из less.
Как мы увидим, есть другие способы заглянуть внутрь ZIP-файла, который предоставляет различные типы информации.
Добавить пароль с помощью команды zipcloak
Если вы создали ZIP-файл, но забыли добавить пароль, что вы можете сделать? Вы можете быстро добавить пароль в ZIP-файл с помощью команды zipcloak
. Передайте имя файла ZIP в командной строке. Вам будет предложено ввести пароль. Вам необходимо подтвердить пароль, введя его во второй раз.
zipcloak source_code.zip
Просмотр сведений о файле с помощью команды zipdetails
Команда zipdetails
покажет вам много информации о ZIP-файле. Единственный разумный способ обработать количество вывода, которое может дать эта команда, состоит в том, чтобы передать его через less.
zipdetails source_code.zip | less
Обратите внимание, что информация будет содержать имена файлов, даже если ZIP-файл защищен паролем. Информация этого типа хранится в ZIP-файле в виде метаданных и не является частью зашифрованных данных.
Поиск внутри файла с помощью команды zipgrep
Команда zipgrep
позволяет вам искать файлы в ZIP-файле. В следующем примере мы хотим знать, какие файлы в ZIP-файле содержат текст «keyval.h».
zipgrep keyval.h source_code.zip
Мы видим, что файлы slang.c и getval.c содержат строку «keyval.h». Мы также видим, что в ZIP-файле есть две копии каждого из этих файлов в разных каталогах.
Просмотр информации с помощью команды zipinfo
Команда zipinfo
дает вам еще один способ заглянуть внутрь ZIP-файла. Как и прежде, мы транслируем вывод через less.
zipinfo source_code.zip | less
Слева направо вывод показывает:
- Файл разрешений
- Версия инструмента, использованного для создания файла ZIP
- Исходный размер файла
- Файловый дескриптор (описан ниже)
- Метод сжатия (в данном случае дефляция)
- Данные и отметка времени
- Название файла и любой каталог
Дескриптор файла состоит из двух символов. Первым символом будет «t» или «b» для обозначения текстового или двоичного файла. Если это заглавная буква, файл зашифрован. Второй символ может быть одним из четырех символов. Этот символ представляет тип метаданных, включаемых в этот файл: нет, расширенный локальный заголовок, «дополнительное поле» или оба.
- -: если ни один не существует, символ будет дефисом
- l: если есть расширенный локальный заголовок, но нет дополнительного поля
- x: если расширенного локального заголовка нет, но есть дополнительное поле
- X: если есть расширенный локальный заголовок и есть дополнительное поле
Разделить файл командой zipsplit
Если вам нужно отправить ZIP-файл кому-либо, но существуют ограничения по размеру или проблемы с передачей файла, вы можете использовать команду zipsplit чтобы разделить исходный ZIP-файл на набор меньших ZIP-файлов.
Опция -n
(размер) позволяет вам установить максимальный размер для каждого из новых файлов ZIP. В этом примере мы source_code.zip файл source_code.zip . Мы не хотим, чтобы новые ZIP-файлы были больше 100 КБ (102400 байт).
zipsplit -n 102400 source_code.zip
Выбранный вами размер не может быть меньше размера любого из файлов в ZIP-файле.
Используя эти команды, вы можете создавать свои собственные ZIP-файлы, распаковывать полученные ZIP-файлы и выполнять с ними различные другие операции, даже не покидая терминал Linux.