Что такое unzip и зачем он нужен
Команда unzip — это утилита командной строки для работы с ZIP-архивами в Linux. Она позволяет извлекать файлы, просматривать содержимое архива, проверять его целостность и выполнять выборочную распаковку. ZIP — один из самых распространённых форматов сжатия, поддерживаемый во всех операционных системах, поэтому умение работать с ним через терминал необходимо для системных администраторов, разработчиков и всех, кто регулярно взаимодействует с серверами.
В отличие от графических архиваторов, unzip работает в любом окружении, включая удалённые серверы через SSH, и легко встраивается в скрипты автоматизации. Это делает его незаменимым инструментом для развёртывания приложений, резервного копирования и обработки загруженных файлов.
Важно понимать, что unzip — это отдельная утилита, которая не входит в состав большинства дистрибутивов по умолчанию. Однако она доступна в официальных репозиториях и устанавливается одной командой.
Установка unzip в популярных дистрибутивах
Перед началом работы убедитесь, что утилита установлена. В большинстве дистрибутивов Linux unzip отсутствует по умолчанию, но его можно быстро добавить через пакетный менеджер.
Debian и Ubuntu:
sudo apt update
sudo apt install unzipRHEL, CentOS, AlmaLinux, Rocky Linux:
sudo dnf install unzip
# Для старых версий CentOS 7 и ранее:
sudo yum install unzipFedora:
sudo dnf install unzipArch Linux и Manjaro:
sudo pacman -S unzipAlpine 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.