Команда unzip в Linux: полное руководство по распаковке ZIP-архивов

Подробное руководство по использованию команды unzip в Linux: установка, синтаксис, основные параметры, практические примеры, безопасность и устранение неполадок.

Что такое unzip и зачем он нужен

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

В отличие от графических архиваторов, unzip работает в любом окружении, включая удалённые серверы через SSH, и легко встраивается в скрипты автоматизации. Это делает его незаменимым инструментом для развёртывания приложений, резервного копирования и обработки загруженных файлов.

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

Установка unzip в популярных дистрибутивах

Перед началом работы убедитесь, что утилита установлена. В большинстве дистрибутивов Linux unzip отсутствует по умолчанию, но его можно быстро добавить через пакетный менеджер.

Debian и Ubuntu:

sudo apt update
sudo apt install unzip

RHEL, CentOS, AlmaLinux, Rocky Linux:

sudo dnf install unzip
# Для старых версий CentOS 7 и ранее:
sudo yum install unzip

Fedora:

sudo dnf install unzip

Arch Linux и Manjaro:

sudo pacman -S unzip

Alpine Linux:

sudo apk add unzip

Рекомендуется также установить пакет zip, который позволяет создавать архивы. В большинстве случаев команды установки выглядят так: sudo apt install zip unzip или sudo dnf install zip unzip.

После установки проверьте версию: unzip -v. Если команда не найдена, проверьте правильность имени пакета и повторите установку.

Основной синтаксис и базовые операции

Синтаксис команды unzip выглядит следующим образом:

unzip [опции] архив.zip [шаблоны_файлов] -d целевая_директория

Самый простой способ распаковать архив в текущую директорию:

unzip file.zip

Если нужно распаковать в определённую папку, используйте опцию -d:

unzip file.zip -d /path/to/directory

При этом целевая директория будет создана автоматически, если она не существует. Убедитесь, что у вас есть права на запись в эту директорию.

По умолчанию unzip восстанавливает структуру папок, сохранённую в архиве. Если вы хотите извлечь все файлы в одну плоскую директорию без подпапок, используйте опцию -j (junk paths):

unzip -j file.zip -d ./flat

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

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

Перед распаковкой часто полезно посмотреть, что находится внутри архива. Для этого используйте опцию -l (list):

unzip -l file.zip

Вывод покажет список файлов с размерами, датами и общим количеством. Более детальную информацию, включая права доступа и метод сжатия, можно получить с помощью -v:

unzip -v file.zip

Также можно использовать команду zipinfo для получения метаданных: zipinfo -1 file.zip выведет только имена файлов.

Проверка целостности архива без извлечения выполняется опцией -t (test):

unzip -t file.zip

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

Управление перезаписью и обновлением файлов

При распаковке в директорию, где уже есть файлы с теми же именами, unzip по умолчанию запрашивает подтверждение для каждого конфликта. В интерактивном режиме вы можете выбрать: перезаписать текущий файл (y), все файлы (A), пропустить текущий (n), пропустить все (N) или переименовать (r).

Для автоматизации и скриптов удобнее использовать флаги:

  • -o — перезаписывать существующие файлы без запроса.
  • -n — никогда не перезаписывать существующие файлы.

Примеры:

unzip -o file.zip   # перезаписать все
unzip -n file.zip   # пропустить существующие

Опция -u (update) извлекает только те файлы, которые новее существующих или отсутствуют. Опция -f (freshen) обновляет только уже существующие файлы, не создавая новых. Эти режимы полезны для инкрементального развёртывания и синхронизации.

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

Выборочное извлечение и исключение файлов

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

unzip file.zip "public/*.php" -d /var/www/html

Шаблоны поддерживают подстановочные знаки (*, ?). Важно заключать их в кавычки, чтобы оболочка не интерпретировала их сама, а передала unzip.

Для исключения файлов используйте опцию -x:

unzip file.zip -x "*/node_modules/*" "*.log" -d /var/www/html

Это исключит все файлы внутри папок node_modules и все файлы с расширением .log.

Примеры практического использования:

  • Извлечь только изображения: unzip media.zip "*.png" "*.jpg" -d ./images
  • Извлечь только логи: unzip logs.zip "*.log" -d ./logs
  • Исключить служебные файлы: unzip app.zip -x "*.git/*" "*.env"

Комбинируя шаблоны и исключения, можно точно контролировать процесс распаковки.

Работа с защищёнными паролем архивами

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

Интерактивный способ (рекомендуется):

unzip protected.zip

Утилита запросит пароль, и вы введёте его скрытно. Этот способ безопаснее, так как пароль не остаётся в истории команд.

Указание пароля в команде:

unzip -P "Пароль" protected.zip

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

Важно: стандартный unzip поддерживает только традиционное ZIP-шифрование (ZipCrypto). Если архив использует более современное AES-шифрование (метод 99), unzip выдаст ошибку unsupported compression method 99. В этом случае используйте 7z:

7z x file.zip

При создании защищённых архивов используйте команду zip -e archive.zip files, которая запросит пароль.

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

unzip отлично подходит для обработки множества архивов. Вот несколько сценариев.

Распаковать все ZIP-файлы в текущей директории:

unzip '*.zip'

Обратите внимание на одинарные кавычки — они предотвращают раскрытие шаблона оболочкой, и unzip сам обрабатывает все архивы.

Распаковать каждый архив в отдельную папку:

for z in *.zip; do
  unzip -n "$z" -d "${z%.zip}"
done

Рекурсивная распаковка всех архивов в подкаталогах:

find /data/backups -type f -name "*.zip" -print0 | while IFS= read -r -d '' z; do
  unzip -n "$z" -d "${z%.zip}"
done

Автоматизация в CI/CD:

set -euo pipefail
ARTIFACT="/tmp/build.zip"
DEST="/var/www/app"
if unzip -t "$ARTIFACT" >/dev/null; then
  mkdir -p "$DEST"
  unzip -q -o "$ARTIFACT" -d "$DEST"
  find "$DEST" -type d -exec chmod 755 {} \;
  find "$DEST" -type f -exec chmod 644 {} \;
  chown -R www-data:www-data "$DEST"
  echo "Deployment complete."
else
  echo "Invalid artifact. Aborting." >&2
  exit 1
fi

В скриптах всегда используйте неинтерактивные флаги (-q, -o, -n) и проверяйте целостность архива перед распаковкой.

Безопасность и права доступа

При работе с ZIP-архивами важно учитывать аспекты безопасности.

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

sudo unzip file.zip -d /var/www/html
sudo chown -R www-data:www-data /var/www/html

Права доступа: unzip пытается восстановить права, сохранённые в архиве, но они могут не соответствовать вашей политике. После распаковки рекомендуется явно установить права:

find /path -type d -exec chmod 755 {} \;
find /path -type f -exec chmod 644 {} \;

Символические ссылки: Архив может содержать символические ссылки, которые при распаковке могут указывать на неожиданные места. Извлекайте архивы только из доверенных источников, чтобы избежать атак через symlink.

Кодировка имён файлов: Если архив создан в системе с другой кодировкой (например, Windows-1251), имена файлов могут отображаться некорректно. Используйте опцию -O для указания кодировки:

unzip -O UTF-8 file.zip

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

Устранение распространённых ошибок

При работе с unzip могут возникать типичные ошибки. Рассмотрим их и способы решения.

unzip: command not found — утилита не установлена. Установите её через пакетный менеджер, как описано выше.

End-of-central-directory signature not found — архив повреждён или не является ZIP-файлом. Чаще всего это происходит из-за неполной загрузки. Скачайте файл заново и проверьте целостность с помощью unzip -t.

skipping: filename unsupported compression method 99 — архив использует AES-шифрование, которое не поддерживается стандартным unzip. Используйте 7z x file.zip.

cannot find or open file.zip — проверьте правильность пути и регистр символов. Используйте абсолютные пути или перейдите в нужную директорию.

skipping: filename — файл уже существует, и вы использовали -n. Для перезаписи добавьте -o.

password: incorrect — неверный пароль. Убедитесь, что пароль введён правильно, учитывая регистр.

Многотомные архивы (.z01, .z02, .zip) — убедитесь, что все части находятся в одной директории, и запустите unzip на файле с расширением .zip.

Ошибки CRC — архив повреждён. Попробуйте восстановить его с помощью zip -FF file.zip --out fixed.zip (если доступен zip).

ZIP или tar.gz: что выбрать

В Linux часто возникает вопрос: использовать ли ZIP или tar.gz. У каждого формата есть свои преимущества.

ZIP:

  • Кроссплатформенная совместимость: работает в Windows, macOS и Linux без дополнительных инструментов.
  • Сжимает каждый файл отдельно, что позволяет извлекать отдельные файлы без распаковки всего архива.
  • Поддерживает шифрование паролем.
  • Удобен для обмена файлами с пользователями Windows.

tar.gz:

  • Нативный формат для Linux/Unix, сохраняет права доступа и владельца файлов.
  • Обеспечивает лучшее сжатие для больших объёмов данных, особенно текстовых файлов.
  • Широко используется для распространения исходных кодов и развёртывания приложений.

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

Вопросы и ответы

Как распаковать файл в Linux в определённую директорию?

Используйте опцию -d с указанием пути:

unzip file.zip -d /path/to/directory

Директория будет создана автоматически, если её нет. Убедитесь, что у вас есть права на запись в эту директорию.

Как распаковать архив, не перезаписав существующие файлы?

Используйте опцию -n (never overwrite):

unzip -n file.zip

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

Как распаковать защищённый паролем ZIP-архив в Linux?

Просто запустите unzip file.zip — утилита запросит пароль интерактивно. Для автоматизации можно указать пароль через -P:

unzip -P "пароль" file.zip

Но помните, что это небезопасно, так как пароль виден в истории команд. Если архив использует AES-шифрование, стандартный unzip не справится — используйте 7z x file.zip.

Как вывести содержимое ZIP-архива без его распаковки?

Используйте опцию -l для краткого списка:

unzip -l file.zip

Для более детальной информации (права, метод сжатия) используйте -v или команду zipinfo file.zip.

Можно ли извлечь из ZIP-архива только определённые файлы или папки?

Да, укажите шаблоны после имени архива:

unzip file.zip "public/*.php" -d /var/www/html

Шаблоны поддерживают подстановочные знаки. Для исключения файлов используйте -x:

unzip file.zip -x "*.log"
Что означает сообщение "Подпись центра каталога не найдена"?

Это ошибка End-of-central-directory signature not found. Она означает, что файл не является корректным ZIP-архивом или повреждён. Чаще всего это происходит из-за неполной загрузки. Скачайте файл заново и проверьте его целостность командой unzip -t file.zip.

Устанавливается ли unzip по умолчанию в Linux?

В большинстве дистрибутивов unzip не установлен по умолчанию. Его нужно установить через пакетный менеджер:

  • Debian/Ubuntu: sudo apt install unzip
  • RHEL/Fedora: sudo dnf install unzip
  • Arch: sudo pacman -S unzip

После установки проверьте командой unzip -v.