Рекомендуем
Clipia AI — 60+ нейросетей для творчества и работы Создавайте изображения, видео, презентации и озвучку с помощью ИИ. Все инструменты в одном сервисе.
Попробовать

ZIP в Linux — команды для создания, обновления и распаковки архивов

Команда zip упаковывает файлы и каталоги в архив .zip, который можно открыть в Linux, Windows и macOS. С её помощью можно архивировать проекты, исключать лишние файлы, обновлять резервные копии, задавать степень сжатия и проверять результат. В руководстве собраны рабочие команды для терминала Linux, включая особенности unzip, защиту паролем и автоматизацию.

ZIP в Linux
ZIP в Linux

Установка zip и unzip занимает одну команду

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

Для Debian и Ubuntu:

sudo apt update
sudo apt install zip unzip

Для Fedora, Rocky Linux, AlmaLinux и других современных систем с DNF:

sudo dnf install zip unzip

Для Arch Linux:

sudo pacman -S zip unzip

Для Alpine Linux:

sudo apk add zip unzip

Для openSUSE:

sudo zypper install zip unzip

Проверка установки:

zip -v
unzip -v

Команды выведут информацию о сборке и поддерживаемых функциях. Дополнительную справку можно открыть через zip -h, zip -h2, man zip и man unzip. Примеры ниже ориентированы на распространённые утилиты Info-ZIP Zip 3.0 и UnZip 6.0. У BusyBox и других реализаций набор параметров может отличаться.

Создание ZIP-архива из файлов и папок

Общий синтаксис команды:

zip [параметры] архив.zip файл_или_каталог ...

Здесь архив.zip — имя создаваемого или изменяемого архива, а остальные аргументы — пути к исходным данным. Если архив уже существует, zip может добавлять в него новые файлы и обновлять записи с совпадающими путями.

Один файл или несколько файлов

Архив с одним документом:

zip documents.zip report.pdf

Архив с тремя файлами:

zip documents.zip report.pdf notes.txt image.png

Добавление ещё одного файла в существующий архив:

zip documents.zip contract.pdf

При успешном выполнении появится documents.zip. Исходные файлы останутся на диске.

Каталог со всеми вложенными папками

Для архивирования дерева каталогов служит параметр -r (recursive):

zip -r website.zip website/

В архив попадут сама папка website, её файлы и вложенные каталоги. Например, путь website/css/style.css сохранится с таким же относительным расположением.

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

Содержимое папки без внешнего каталога

Предположим, в папке website лежат index.html, .env и каталог assets. Чтобы записать их в корень архива:

cd website
zip -r ../website.zip .

Внутри website.zip окажутся index.html, .env, assets/... и записи с относительными путями от текущего каталога. Архив создаётся уровнем выше, что предотвращает случайное попадание готового архива в собственный набор исходных файлов.

Скрытые файлы тоже включаются. Рекурсивный обход каталога через zip -r захватывает .env, .git и другие имена, начинающиеся с точки. Для проектов с секретами это критично: архив может содержать пароли, токены и приватные ключи.

Несколько каталогов в одном архиве

zip -r project.zip app/ config/ public/ composer.json

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

Исключение файлов и выбор нужных расширений

Для реального проекта архивирование всей папки часто создаёт лишний объём. Например, node_modules, кэш, журнал ошибок и история Git могут занимать сотни мегабайт.

Исключение по маске через -x

zip -r website.zip website/ \
  -x 'website/node_modules/*' \
     'website/.git/*' \
     'website/storage/logs/*' \
     '*.log'

Параметр -x исключает имена, подходящие под заданные маски. Здесь архив содержит проект без зависимостей Node.js, истории Git и файлов журналов.

Одинарные кавычки важны. Они передают символ * программе zip, чтобы она сопоставляла маску с путями на всех уровнях. Без кавычек оболочка Bash может развернуть маску ещё до запуска утилиты.

В масках используются внутренние пути архива. Например, если запускать zip -r website.zip website/, шаблон исключения должен учитывать начальное website/.

Когда нужно убрать и запись о каталоге, и его содержимое, можно передать обе маски:

zip -r project.zip project/ \
  -x 'project/.git' 'project/.git/*'

Архив только с определёнными файлами через -i

Команда -i ограничивает набор подходящими именами:

zip -r php-files.zip project/ -i '*.php'

Она создаёт архив из PHP-файлов в project, включая вложенные каталоги. Другой пример — собрать исходные тексты:

zip -r sources.zip project/ -i '*.php' '*.js' '*.css'

Параметры -i и -x могут использоваться совместно. Результат зависит от того, какие пути попадают под каждую маску. Перед запуском на больших проектах список выбранных файлов можно проверить через -sf:

zip -r -sf project.zip project/ -x 'project/.git/*'

-sf показывает предполагаемый список файлов без создания или изменения архива.

Архивирование файлов со сложными именами

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

zip archive.zip 'Отчёт за ноябрь.txt'
zip -r archive.zip 'Мои документы/'

На Linux с локалью UTF-8 Info-ZIP поддерживает Unicode-имена. При переносе старых ZIP-архивов между Windows и Linux иногда появляются проблемы с кодировкой имён, особенно если архив был создан с устаревшей локальной кодовой страницей.

Уровень сжатия определяет размер и время работы

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

ПараметрЧто происходитТипичный сценарий
-0Данные записываются без сжатияУже сжатые видео и архивы
-1Быстрое сжатиеСрочная упаковка большого каталога
-6Средний уровеньПовседневные документы и проекты
-9Максимальное сжатие в рамках метода DeflateТекстовые данные, где важен размер

Примеры:

zip -r -0 videos.zip videos/
zip -r -1 quick.zip project/
zip -r -9 source-code.zip source/

Изображения JPEG, видео MP4 и файлы PDF со встроенным сжатием часто уменьшаются незначительно. Исходный код, HTML, CSS, JSON и текстовые журналы обычно сжимаются заметнее. Фактический результат зависит от содержимого данных.

По умолчанию Info-ZIP использует совместимый метод сжатия Deflate, если не задан иной метод. Расширение .zip описывает контейнер, внутри которого могут применяться разные методы. Совместимость некоторых методов с архиваторами других систем различается.

Обновление, синхронизация и удаление файлов из ZIP

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

Добавление новых и изменённых файлов

zip -r backup.zip project/

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

Обновление только более новых файлов через -u

zip -ur backup.zip project/

-u добавляет отсутствующие записи и обновляет существующие, когда исходные файлы имеют более новое время изменения. Для корректного сравнения важны системное время, часовой пояс и сохранённые метки времени файлов.

Обновление только уже имеющихся записей через -f

zip -fr backup.zip project/

-f (freshen) заменяет изменившиеся записи, которые уже присутствуют в архиве. Новые файлы из каталога не добавляются.

Синхронизация архива с папкой через -FS

zip -r -FS backup.zip project/

-FS сравнивает содержимое архива с файлами на диске: изменённые файлы обновляются, новые добавляются, а отсутствующие удаляются из архива. Имена и относительные пути должны совпадать с теми, которые использовались при создании архива.

Осторожно: -FS удаляет записи. Запуск из другого рабочего каталога, изменение списка входных путей или неудачная маска исключения способны привести к потере содержимого существующего архива. Для важных данных безопаснее сохранять предыдущую копию, а затем проверять полученный результат. Такое поведение описано в руководстве Info-ZIP.

Удаление файлов из существующего архива через -d

zip -d archive.zip 'project/old.txt'

Удаление группы файлов:

zip -d archive.zip 'project/tmp/*'

Здесь маски сопоставляются с путями, уже записанными внутри архива. Для просмотра точных имён подходит unzip -Z -1 archive.zip.

Перемещение файлов в архив через -m

zip -m documents.zip report.txt notes.txt

-m удаляет исходные файлы после успешного добавления в ZIP. При рекурсивном архивировании программа может удалить обработанные исходные файлы и опустевшие каталоги. В сценариях резервного копирования этот параметр создаёт риск неожиданного удаления рабочих данных.

Права доступа, символические ссылки и структура папок

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

Сохранение символических ссылок через -y

zip -ry project.zip project/

На Unix -y записывает символические ссылки как ссылки, сохраняя их цель в виде пути. Без этой опции Info-ZIP обычно архивирует содержимое файла, на который указывает ссылка. Восстановление ссылок зависит от распаковщика и условий безопасности.

Удаление лишних дополнительных атрибутов через -X

zip -rX share.zip shared-files/

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

Запись без отдельных записей для каталогов через -D

zip -rD files.zip project/

-D пропускает записи каталогов. Файлы с вложенными путями всё равно архивируются. Пустые директории в таком архиве могут не восстановиться, поскольку соответствующих записей не будет.

Удаление структуры путей через -j

zip -j documents.zip reports/2026/november.pdf

В архив попадёт имя november.pdf без пути reports/2026/. Этот режим удобен для небольшой подборки документов из разных мест. Если два исходных файла имеют одинаковое базовое имя, возможен конфликт имён внутри ZIP.

Защита ZIP-архива паролем и её ограничения

Info-ZIP поддерживает интерактивное назначение пароля:

zip -er private.zip private/

-e запрашивает пароль и подтверждение в терминале, -r обходит каталог. При распаковке защищённых файлов unzip также запросит пароль.

В стандартном Info-ZIP Zip 3.0 используется исторический механизм ZipCrypto. Он имеет известные криптографические слабости. Пароль здесь защищает содержимое файлов лишь в рамках возможностей этого устаревшего алгоритма; имена файлов и другая структура архива обычно остаются видимыми.

Можно встретить вариант zip -P пароль, но такая запись небезопасна: пароль оказывается в аргументах процесса, может сохраниться в истории команд и попасть в журналы. Для конфиденциальных резервных копий используют архиваторы с поддержкой современного шифрования, например ZIP с AES-256 в совместимом архиваторе или формат 7z с подходящими настройками. Их совместимость с конкретным распаковщиком нужно проверять отдельно. Ограничения парольной защиты Info-ZIP также отражены в документации UnZip.

Просмотр содержимого и проверка целостности ZIP

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

Список файлов и размеры

unzip -l archive.zip

Команда выводит имена файлов, размеры до сжатия и время изменения. Более подробная информация о методах и степени сжатия:

unzip -v archive.zip

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

unzip -Z -1 archive.zip

Другой вариант просмотра подробных сведений:

zipinfo archive.zip

Проверка CRC и чтения файлов

unzip -t archive.zip

Для краткого отчёта:

unzip -tq archive.zip

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

Проверка прямо во время создания

zip -rT backup.zip project/

Флаг -T запускает тест нового архива через unzip -tqq. Для использования нужна доступная утилита unzip. При ошибке проверки zip сообщает о проблеме и не заменяет старый архив непроверенной версией.

Контрольная сумма для передачи или хранения

sha256sum backup.zip > backup.zip.sha256

Позже проверить неизменность самого файла ZIP можно так:

sha256sum -c backup.zip.sha256

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

Распаковка ZIP-архива через unzip

По умолчанию unzip извлекает файлы в текущий каталог:

unzip archive.zip

Распаковка в указанную директорию

unzip archive.zip -d /home/user/extracted/

Если путь назначения доступен для записи, unzip создаст нужную структуру вложенных папок.

Распаковка с перезаписью или пропуском файлов

unzip -o archive.zip -d extracted/

-o перезаписывает существующие файлы без вопросов. Для пропуска уже существующих файлов:

unzip -n archive.zip -d extracted/

-n оставляет их нетронутыми. Перед распаковкой неизвестного архива полезно сначала изучить unzip -l, особенно если выбран режим автоматической перезаписи.

Извлечение одного файла

unzip archive.zip 'project/config/app.php' -d extracted/

Имя должно соответствовать пути внутри архива. Несколько файлов можно указать отдельными аргументами или маской.

Извлечение без вложенных папок

unzip -j archive.zip -d flat/

-j отбрасывает пути каталогов и складывает файлы в одну директорию. Одинаковые имена из разных папок могут конфликтовать.

Чтение файла из ZIP без записи на диск

unzip -p archive.zip 'project/config/app.php'

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

unzip -p archive.zip 'project/README.md' | less

Для бинарных файлов удобнее перенаправлять данные в файл или другую программу, способную обработать этот формат.

Большие архивы, многотомные ZIP и работа через конвейер

Для объёмных резервных копий могут пригодиться разделение архива на части и запись в поток. Эти возможности поддерживает Info-ZIP 3.0; при обмене файлами стоит учитывать возможности распаковщика получателя.

Разделение архива на части

zip -r -s 100m big-backup.zip big-folder/

Параметр -s 100m ограничивает размер отдельной части примерно 100 МБ. На выходе могут появиться big-backup.z01, big-backup.z02 и завершающий big-backup.zip. Для восстановления необходим полный набор частей.

Преобразование многотомного ZIP в единый файл:

zip -s 0 big-backup.zip --out complete-backup.zip

Простое объединение частей через cat может нарушить внутренние смещения ZIP. Для разделённых архивов используется штатная операция zip -s 0 ... --out .... Обычный unzip не во всех сборках умеет напрямую извлекать такие архивы. Подробности описаны в справке Zip 3.0.

Архивирование списка из find

Иногда файлы находятся в разных папках. Команда -@ читает пути по одному на строку из стандартного ввода:

find project -type f -name '*.log' -print | zip logs.zip -@

find отбирает файлы журналов, а zip добавляет их в архив с относительными путями. Важное ограничение: формат -@ разделяет пути переводами строк. Он плохо подходит для имён файлов, содержащих сам символ перевода строки.

Запись ZIP в стандартный вывод

Архив можно отправить прямо в поток, указав - на месте его имени:

zip -qr - project/ > project.zip

Здесь -q подавляет обычные сообщения программы, -r обходит каталог, а бинарные данные ZIP записываются в project.zip средствами оболочки. При использовании конвейеров и перенаправления вывода важно избегать смешивания архивных данных с текстовыми сообщениями.

Передача стандартного ввода в ZIP

printf 'Пример текста\n' | zip stream.zip -

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

Резервная копия сайта с проверкой результата

Типичный серверный сценарий — архивировать каталог приложения, пропустить технические файлы и сохранить результат с датой. Пусть сайт расположен в /var/www/site, а архивы хранятся в /var/backups/site.

Создание каталога для копий, если у пользователя есть необходимые права:

mkdir -p /var/backups/site

Одноразовая команда:

cd /var/www
zip -rT "/var/backups/site/site-$(date +%F_%H-%M-%S).zip" site/ \
  -x 'site/.git/*' \
     'site/node_modules/*' \
     'site/storage/logs/*' \
     'site/storage/framework/cache/*'

В архив попадёт папка site с основной частью проекта. Папки Git, Node.js-зависимостей и часть временных данных будут исключены. Команда -T проверит созданный ZIP.

Для автоматического запуска можно сохранить следующий скрипт как /usr/local/bin/site-zip-backup.sh:

#!/usr/bin/env bash
set -euo pipefail

SOURCE_PARENT='/var/www'
BACKUP_DIR='/var/backups/site'
STAMP="$(date +%F_%H-%M-%S)"
ARCHIVE="$BACKUP_DIR/site-$STAMP.zip"

mkdir -p "$BACKUP_DIR"
cd "$SOURCE_PARENT"

zip -rqT "$ARCHIVE" site/ \
  -x 'site/.git/*' \
     'site/node_modules/*' \
     'site/storage/logs/*' \
     'site/storage/framework/cache/*'

sha256sum "$ARCHIVE" > "$ARCHIVE.sha256"
printf 'Создан архив: %s\n' "$ARCHIVE"

После сохранения скрипта:

sudo chmod +x /usr/local/bin/site-zip-backup.sh

Пример строки для crontab -e, если нужно запускать копирование ежедневно в 03:00 по часовому поясу планировщика:

0 3 * * * /usr/local/bin/site-zip-backup.sh >> /var/log/site-zip-backup.log 2>&1

Задача выполнится от имени владельца соответствующей записи crontab. Доступ к исходным папкам, месту назначения и журналу должен соответствовать его правам. Для приложения с активной записью в файлы обычное ZIP-архивирование не гарантирует согласованное состояние данных. Рабочая база MySQL или PostgreSQL требует отдельной согласованной выгрузки либо подходящего механизма снимков. Архив с исходниками сайта сам по себе не содержит резервную копию базы данных.

Пароли, .env и приватные ключи, если они присутствуют в каталоге, также могут попасть в ZIP. Это существенный вопрос при загрузке копий в стороннее облако.

Справочник основных параметров zip и unzip

Команда или опцияНазначение
zip archive.zip fileСоздать ZIP с файлом или добавить его в существующий ZIP
zip -r archive.zip dir/Добавить каталог рекурсивно
zip -0 ...Архивировать без сжатия
zip -9 ...Максимальный уровень Deflate
zip -x 'маска' ...Исключить подходящие файлы
zip -i 'маска' ...Включить файлы по маске
zip -sf ...Предварительно показать список выбранных файлов
zip -u ...Добавить новые и более свежие файлы
zip -f ...Обновить только существующие записи
zip -FS ...Синхронизировать архив с источником, включая удаления
zip -d archive.zip 'путь'Удалить запись из архива
zip -m ...Удалить исходники после успешного архивирования
zip -y ...Сохранять символические ссылки как ссылки
zip -X ...Убрать часть дополнительных атрибутов
zip -D ...Не добавлять отдельные записи каталогов
zip -j ...Убрать структуру каталогов из путей файлов
zip -e ...Запросить пароль для ZIP
zip -T ...Проверить созданный архив
zip -s 100m ...Создать многотомный ZIP
zip -@ ...Получать список файлов из стандартного ввода
zip -q ...Уменьшить объём сообщений
zip -vПоказать информацию о версии и сборке
unzip -l archive.zipПросмотреть содержимое
unzip -t archive.zipПроверить целостность записей
unzip archive.zip -d dir/Распаковать в каталог
unzip -o archive.zipРаспаковать с перезаписью
unzip -n archive.zipПропускать существующие файлы
unzip -j archive.zipИзвлечь без структуры каталогов
unzip -p archive.zip fileВывести содержимое файла в stdout

Ошибки архивирования чаще всего связаны с путями, правами и содержимым

zip error: Nothing to do! возникает, когда утилите нечего добавить: путь указан неправильно, файлы отсутствуют или все совпадения исключены фильтрами. Проверить текущий каталог и исходные пути помогут pwd и ls -la.

command not found указывает, что исполняемая программа отсутствует в PATH или пакет не установлен. Для проверки подходят command -v zip и command -v unzip.

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

Слишком большой ZIP часто связан с архивированием node_modules, .git, логов и медиафайлов. В этом случае фильтры -x и выбор подходящего уровня сжатия влияют на размер значительно сильнее, чем переход от -6 к -9.

Нежелательная структура папок обычно появляется из-за неверного рабочего каталога. Команды zip -r archive.zip project/ и cd project && zip -r ../archive.zip . сохраняют разные относительные пути.

Ошибки распаковки могут возникать из-за отсутствующих частей многотомного архива, повреждения ZIP, несовместимого метода сжатия или неверного пароля. Инструменты unzip -t, unzip -v и zipinfo помогают выяснить причину.

Если структура архива повреждена, Info-ZIP предоставляет ограниченное восстановление в новый файл:

zip -F damaged.zip --out repaired.zip

При более серьёзных повреждениях существует режим -FF:

zip -FF damaged.zip --out repaired-attempt.zip

Эти операции способны восстановить часть структуры, но не исправляют повреждённые данные файлов с неправильными контрольными суммами. Полученный архив может быть неполным, поэтому исходный повреждённый файл сохраняют отдельно.

ZIP остаётся совместимым форматом для повседневных архивов Linux

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

Источники

При использовании материалов сайта необходимо указывать ссылку на TGLand.ru. Если вы копируете фрагменты текста в интернете, прямая гиперссылка, доступная для индексации поисковыми системами, должна быть размещена в начале материала.

Вам также может понравиться