Команда zip: сжатие папок, распаковка через unzip и опции сжатия
Команда zip объединяет в Linux файлы и папки в один сжатый zip-файл, а для распаковки вместе с ней используют unzip. На сервере AlmaLinux 9 папка веб-сайта, сжатая через zip -r, уменьшилась с 35 825 байт до 4 158 байт, а unzip -O исправил нечитаемые имена файлов в zip-файле, созданном в Windows.
Вывод ниже получен в рабочей папке на сервере AlmaLinux 9.8 от имени root, время указано в UTC. Сжатая папка site и файлы заметок — примеры, созданные для теста. Zip-файл из Windows воспроизведён тестовым файлом, имена файлов в котором записаны в CP949.
1️⃣ Как пользоваться командой zip
После zip сначала укажите имя нового zip-файла, а затем перечислите файлы, которые нужно в него положить. Команда ниже сжимает два файла, readme.txt и memo.txt, в один notes.zip.
zip notes.zip readme.txt memo.txt adding: readme.txt (deflated 92%)
adding: memo.txt (stored 0%)[deflated 92%] в конце строки — это на сколько уменьшился файл относительно исходного размера. [stored 0%] в строке memo.txt размером 71 байт означает, что файл сохранён в исходном размере без сжатия.
Чтобы сжать папку, добавьте -r. Если указать только имя папки без -r, в архив попадёт лишь запись папки site/, а файлы внутри — нет.
zip nodir.zip site adding: site/ (stored 0%)Сжимаемая папка site, как показано ниже, состоит из трёх подпапок и шести файлов.
С -r в архив попадают все десять записей: подпапки, файлы в них и даже .htaccess, имя которого начинается с точки.
zip -r site.zip site adding: site/ (stored 0%)
adding: site/css/ (stored 0%)
adding: site/css/style.css (deflated 93%)
adding: site/js/ (stored 0%)
adding: site/js/app.js (deflated 87%)
adding: site/logs/ (stored 0%)
adding: site/logs/access.log (deflated 94%)
adding: site/index.html (deflated 91%)
adding: site/about.html (deflated 87%)
adding: site/.htaccess (deflated 9%)Что лежит в готовом zip-файле, можно проверить без распаковки через unzip -l. Сохранённые файлы в сумме занимали 35 825 байт, а ls -l показал site.zip размером 4 158 байт.
unzip -l site.zipArchive: site.zip
Length Date Time Name
--------- ---------- ----- ----
0 10-28-2026 22:10 site/
0 10-28-2026 22:10 site/css/
4431 10-28-2026 22:10 site/css/style.css
0 10-28-2026 22:10 site/js/
1882 10-28-2026 22:10 site/js/app.js
0 10-28-2026 22:10 site/logs/
24134 10-28-2026 22:10 site/logs/access.log
3723 10-28-2026 22:10 site/index.html
1612 10-28-2026 22:10 site/about.html
43 10-28-2026 22:10 site/.htaccess
--------- -------
35825 10 filesls -l site.zip-rw-r--r-- 1 root root 4158 Oct 28 23:05 site.zip2️⃣ Опции команды zip
Среди опций команды zip -x исключает файлы по шаблону. Если указать [site/logs/*], чтобы пропустить папку журналов, папка logs и access.log не попадут в архив, и в него войдут только восемь записей.
zip -r site-nolog.zip site -x 'site/logs/*' adding: site/ (stored 0%)
adding: site/css/ (stored 0%)
adding: site/css/style.css (deflated 93%)
adding: site/js/ (stored 0%)
adding: site/js/app.js (deflated 87%)
adding: site/index.html (deflated 91%)
adding: site/about.html (deflated 87%)
adding: site/.htaccess (deflated 9%)Заключите шаблон в одинарные кавычки, чтобы оболочка не превратила [*] в имена файлов заранее. С той же целью официальное руководство приводит пример с обратной косой чертой перед [*].
-u заново добавляет только файлы, изменённые после создания zip-файла. После добавления строки в конец index.html запуск с -ru заново добавляет только этот файл с пометкой [updating].
zip -ru site.zip siteupdating: site/index.html (deflated 90%)Повторный запуск той же команды без изменённых файлов ничего не вывел, а код выхода был 12. В официальном руководстве 12 означает, что zip нечего делать.
zip -ru site.zip site; echo $?12Чтобы удалить записи внутри zip-файла, используйте -d. Если указать [site/logs/*], запись папки logs и access.log удаляются из site.zip.
zip -d site.zip 'site/logs/*'deleting: site/logs/
deleting: site/logs/access.logЧисла от -0 до -9 задают уровень сжатия, по официальному руководству по умолчанию используется -6. Одна и та же папка site была сжата три раза с -q без вывода, чтобы сравнить размеры. Поскольку при проверке -u в index.html добавили строку, сумма исходных файлов теперь составляет 35 875 байт.
zip -qr -0 level0.zip sitezip -qr level6.zip sitezip -qr -9 level9.zip sitels -l level*.zip-rw-r--r-- 1 root root 37433 Oct 28 23:05 level0.zip
-rw-r--r-- 1 root root 4179 Oct 28 23:05 level6.zip
-rw-r--r-- 1 root root 3874 Oct 28 23:05 level9.zip| Уровень сжатия | Размер zip-файла | Относительно исходной суммы |
|---|---|---|
| Сумма исходных файлов | 35 875 байт | 100% |
| -0 (без сжатия) | 37 433 байта | 104.3% |
| -6 (по умолчанию) | 4 179 байт | 11.6% |
| -9 (максимальное сжатие) | 3 874 байта | 10.8% |
37 433 байта, полученные с -0, оказались больше исходной суммы 35 875 байт. Это несжатые данные плюс 1 558 байт заголовков, таких как имена файлов и время, которые добавляются к каждой записи. -9 оказался на 305 байт меньше значения по умолчанию, и вся разница пришлась на самый большой файл, access.log.
Чтобы задать пароль, добавьте -e. Пароль вводится дважды, а набираемые символы на экране не отображаются.
zip -e secret.zip memo.txtEnter password:
Verify password:
adding: memo.txt (stored 0%)Даже secret.zip, созданный с -e, в unzip -l показал имена, размеры и даты файлов без пароля. Шифруется только содержимое файлов, поэтому для данных, у которых нужно скрыть и имена файлов, это не подходит.
unzip -l secret.zipArchive: secret.zip
Length Date Time Name
--------- ---------- ----- ----
71 10-28-2026 22:10 memo.txt
--------- -------
71 1 file-P, которая пишет пароль прямо в командной строке, — опция, о небезопасности которой предупреждает официальное руководство: другие пользователи того же сервера могут видеть запущенные команды. Руководство также описывает само стандартное шифрование zip как сравнительно слабое.
При распаковке zip, созданного с -e, unzip спрашивает пароль для каждого файла, и после правильного ввода файл распаковывается.
unzip secret.zip -d decArchive: secret.zip
[secret.zip] memo.txt password:
extracting: dec/memo.txt📌 Основные опции: результаты из этой статьи
| Опция | Назначение | Результат в этой статье | |
|---|---|---|---|
| zip -r | Добавляет все подпапки и файлы внутри папки | Без -r одна строка adding: site/, с -r десять записей, включая .htaccess | |
| zip -x | Исключает файлы по шаблону | Без site/logs/* только восемь записей, без папки logs и access.log | |
| zip -u | Заново добавляет только файлы, изменённые после создания zip-файла | Одна строка updating: site/index.html (deflated 90%); без изменений вывода нет, код выхода 12 | |
| zip -d | Удаляет записи внутри zip-файла | deleting: site/logs/ и deleting: site/logs/access.log | |
| zip -q | Скрывает строки, выводимые при сжатии | Все три команды, сжатые с -qr (-0, по умолчанию, -9), завершились без строк adding | |
| zip -0 | Только сохраняет, без сжатия | level0.zip занимает 37433 байта, больше исходной суммы | |
| zip -9 | Сжимает как можно сильнее (по умолчанию -6) | level9.zip 3874 байта, level6.zip со значением по умолчанию 4179 байт | |
| zip -e | Спрашивает пароль и шифрует содержимое | Спрашивает Enter password: и Verify password:, затем adding: memo.txt (stored 0%) | |
| unzip -l | Выводит список сохранённых записей без распаковки | site.zip: 10 files, всего 35825 байт | |
| unzip -d | Задаёт папку для распаковки и создаёт её, если её нет | Начинается с creating: restore/site/, и структура папки site распаковывается внутрь restore | |
| unzip -o | Перезаписывает все существующие файлы без вопросов | Пять строк inflating без вопросов | |
| unzip -n | Пропускает существующие файлы без вопросов | После строки Archive: site.zip ничего не выводится | |
| unzip -t | Проверяет сжатые данные без распаковки | OK для каждой записи и No errors detected; обрезанный broken.zip даёт End-of-central-directory signature not found | |
| unzip -O | Задаёт кодировку символов имён файлов внутри zip | С -O CP949 нечитаемые имена отображаются как 보고서.txt и 견적서.txt («отчёт» и «смета» по-корейски) | |
| unzip -p | Отправляет распакованное содержимое в стандартный вывод вместо создания файлов | Выводятся только две строки .htaccess, файл не создаётся |
📎 Другие опции: по официальному руководству
| Опция | Назначение | |
|---|---|---|
| zip -m | Удаляет исходные файлы и папки после сжатия (когда zip-файл полностью готов; официальное руководство советует использовать вместе с -T) | |
| zip -j | Сохраняет только имена файлов без путей папок | |
| zip -y | Сохраняет символическую ссылку как ссылку, а не файл, на который она указывает | |
| zip -T | Проверяет созданный zip-файл и при неудачной проверке не меняет исходный zip-файл | |
| zip -f | Заменяет изменёнными файлами только записи, которые уже есть в zip-файле, и не добавляет новые файлы | |
| zip -i | Добавляет только файлы, подходящие под заданный шаблон | |
| zip -P | Пишет пароль прямо в командной строке (официальное руководство предупреждает, что это небезопасно) | |
| unzip -j | Распаковывает только файлы в одну папку, не создавая структуру папок из zip | |
| unzip -x | Задаёт записи, которые не нужно распаковывать | |
| unzip -q | Скрывает строки, выводимые при распаковке | |
| unzip -u | Распаковывает только файлы, которых нет на диске, и более новые | |
| unzip -v | Добавляет в список метод сжатия, сжатый размер, степень сжатия и CRC |
3️⃣ Как пользоваться командой unzip
Чтобы распаковать zip-файл в Linux, укажите имя zip-файла после unzip. Если не задать папку через -d, файлы распакуются в текущую папку (по официальному руководству), поэтому в этот раз была указана папка restore.
unzip site.zip -d restoreArchive: site.zip
creating: restore/site/
creating: restore/site/css/
inflating: restore/site/css/style.css
creating: restore/site/js/
inflating: restore/site/js/app.js
inflating: restore/site/index.html
inflating: restore/site/about.html
inflating: restore/site/.htaccessЕсли папки, указанной в -d, нет, unzip создаёт её и распаковывает внутрь структуру папки site как есть.
При повторной распаковке в то же место unzip останавливается на каждом уже существующем файле и спрашивает, перезаписать ли его. Если выбрать [N]one, распаковка завершится без перезаписи оставшихся файлов.
unzip site.zip -d restoreArchive: site.zip
replace restore/site/css/style.css? [y]es, [n]o, [A]ll, [N]one, [r]ename: NЧтобы обойтись без вопросов, добавьте -o или -n. -o перезаписывает все существующие файлы, а -n их пропускает. Поскольку официальное руководство называет -o опасной опцией, сначала убедитесь, что папку можно перезаписать, и только потом добавляйте -o.
unzip -o site.zip -d restoreArchive: site.zip
inflating: restore/site/css/style.css
inflating: restore/site/js/app.js
inflating: restore/site/index.html
inflating: restore/site/about.html
inflating: restore/site/.htaccessunzip -n site.zip -d restoreArchive: site.zipЕсли распаковать с -n туда, где все файлы уже есть, после строки Archive ничего не выводится.
Чтобы распаковать только часть zip-файла, укажите после его имени путь или шаблон. Если указать [site/css/*], распакуются только папка css и style.css.
unzip site.zip 'site/css/*' -d partArchive: site.zip
creating: part/site/css/
inflating: part/site/css/style.css4️⃣ Ошибки unzip
Zip-файл, полученный с другого сервера, перед распаковкой проверьте через unzip -t. Если со сжатыми данными всё в порядке, у каждой записи выводится OK, а в последней строке — [No errors detected].
unzip -t site.zipArchive: site.zip
testing: site/ OK
testing: site/css/ OK
testing: site/css/style.css OK
testing: site/js/ OK
testing: site/js/app.js OK
testing: site/index.html OK
testing: site/about.html OK
testing: site/.htaccess OK
No errors detected in compressed data of site.zip.Zip-файл, у которого из-за прерванной передачи обрезался конец, завершился сообщением [End-of-central-directory signature not found]. Это результат проверки через -t файла broken.zip, в котором оставили только первые 2 000 байт site.zip; site.zip после удаления записей logs через -d занимал 2 436 байт.
unzip -t broken.zipArchive: broken.zip
End-of-central-directory signature not found. Either this file is not
a zipfile, or it constitutes one disk of a multi-part archive. In the
latter case the central directory and zipfile comment will be found on
the last disk(s) of this archive.
unzip: cannot find zipfile directory in one of broken.zip or
broken.zip.zip, and cannot find broken.zip.ZIP, period.unzip сначала читает список файлов в самом конце zip-файла (central directory). Поэтому у broken.zip с обрезанным концом он не смог проверить даже первую запись.
Файл, который не является zip, дал то же сообщение. site.tar.gz, упакованный через tar, в unzip завершился той же ошибкой, а файлы tar.gz распаковывает команда tar.
unzip site.tar.gzArchive: site.tar.gz
End-of-central-directory signature not found. Either this file is not
a zipfile, or it constitutes one disk of a multi-part archive. In the
latter case the central directory and zipfile comment will be found on
the last disk(s) of this archive.
unzip: cannot find zipfile directory in one of site.tar.gz or
site.tar.gz.zip, and cannot find site.tar.gz.ZIP, period.Zip-файл, созданный в Windows, иногда хранит имена файлов не в UTF-8, а в кодировке символов Windows. Когда report-win.zip, имена в котором записаны в CP949, открыли через unzip -l на сервере с UTF-8, имена файлов превратились в нечитаемые символы.
unzip -l report-win.zipArchive: report-win.zip
Length Date Time Name
--------- ---------- ----- ----
26 10-28-2026 22:10 ║╕░э╝н.txt
17 10-28-2026 22:10 ░▀└√╝н.txt
--------- -------
43 2 filesЕсли после -O указать кодировку символов Windows, в которой создан zip, имена отображаются правильно, а файлы, распакованные с той же опцией, создаются с исходными именами.
unzip -O CP949 -l report-win.zipArchive: report-win.zip
Length Date Time Name
--------- ---------- ----- ----
26 10-28-2026 22:10 보고서.txt
17 10-28-2026 22:10 견적서.txt
--------- -------
43 2 filesunzip -O CP949 report-win.zip -d winArchive: report-win.zip
inflating: win/보고서.txt
inflating: win/견적서.txtСогласно справке unzip, -O — опция для zip-файлов, созданных в DOS и Windows, а -I — для zip-файлов из других систем.
Ниже — сообщения об ошибках, появившиеся при распаковке, и что проверить дальше.
| Вывод | Назначение | Что проверить дальше |
|---|---|---|
| End-of-central-directory signature not found | Список файлов в конце zip-файла не найден — файл обрезан или это не zip | Сравнить размер с оригиналом и скачать заново · tar.gz через tar |
| cannot find or open | В текущей папке нет файла с таким именем | Имя и расположение файла через ls |
| skipping: … incorrect password | Пароль трижды неверен, файл пропущен (код выхода 82) | Регистр букв пароля и язык ввода |
| Имена файлов превращаются в символы | Имена записаны в кодировке символов Windows | Эта кодировка (например, CP949) после -O |
🔲 Симулятор команды zip
В симуляторе ниже можно самостоятельно ввести шаги: сжать через zip, а затем посмотреть список или распаковать через unzip.
🔢 FAQ & рекомендуемые материалы
WordPress · Плагины
Установка плагина WordPress: поиск, загрузка ZIP и активация
Порядок установки плагина с экрана «Добавить плагин»: через поиск в официальном каталоге или загрузку zip-файла.
Поиск
Команда find в Linux
Команда find ищет файлы по условиям вроде имени, расширения, размера и даты и продолжает работу с найденными файлами.
Управление файлами
Опции команды cp и массовая перезапись при выполнении
Опции команды cp для копирования файлов и каталогов и способ массового копирования без подтверждения перезаписи.
ℹ️ О партнёрских ссылках
Материалы этого сайта содержат партнёрские ссылки. Если посетитель покупает товар или услугу по такой ссылке, сайт получает комиссию от продавца. При этом сумма, которую платит покупатель (при акционных скидках сумма снижается ↓), не увеличивается. Указанные цены, скидки и наличие актуальны на момент написания и могут отличаться, поэтому перед покупкой уточняйте их у продавца. Товары выбираются и оцениваются по нашим собственным критериям, а комиссия не влияет ни на порядок, ни на содержание обзоров.