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

Установка 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.zipunzip -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, возможность изменения исходных файлов во время архивирования и состав метаданных, которые способен восстановить конкретный распаковщик.
Источники
- Руководство Info-ZIP Zip 3.0 — Debian Manpages — синтаксис, маски, режимы обновления, разделение и тестирование архивов.
- Руководство UnZip 6.0 — Ubuntu Manpages — просмотр, извлечение, проверка CRC и работа с паролями.
- ArchWiki — Archiving and compression — применение ZIP и других утилит архивирования в Linux.