Команда zip: сжатие папок, распаковка через unzip и опции сжатия

Тестовая средаСемейство RHELAlmaLinux 9.8Учётная запись rootПроверено 2026-11-05
Команды сжатия · архивированияzipunzipРасположение/usr/bin/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

  • ↪️ Сжатие файлов и папок (-r)

После 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, как показано ниже, состоит из трёх подпапок и шести файлов.

site/
css/
style.css
js/
app.js
logs/
access.log
index.html
about.html
.htaccess

С -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.zip
Archive:  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 files
ls -l site.zip
-rw-r--r-- 1 root root 4158 Oct 28 23:05 site.zip

2️⃣ Опции команды zip

  • ↪️ -x, -u, -d, уровень сжатия, -e

Среди опций команды 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 site
updating: 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 site
zip -qr level6.zip site
zip -qr -9 level9.zip site
ls -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.txt
Enter password:
Verify password:
  adding: memo.txt (stored 0%)

Даже secret.zip, созданный с -e, в unzip -l показал имена, размеры и даты файлов без пароля. Шифруется только содержимое файлов, поэтому для данных, у которых нужно скрыть и имена файлов, это не подходит.

unzip -l secret.zip
Archive:  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 dec
Archive:  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 и -d, -o, -n

Чтобы распаковать zip-файл в Linux, укажите имя zip-файла после unzip. Если не задать папку через -d, файлы распакуются в текущую папку (по официальному руководству), поэтому в этот раз была указана папка restore.

unzip site.zip -d restore
Archive:  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 restore
Archive:  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 restore
Archive:  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/.htaccess
unzip -n site.zip -d restore
Archive:  site.zip

Если распаковать с -n туда, где все файлы уже есть, после строки Archive ничего не выводится.

Чтобы распаковать только часть zip-файла, укажите после его имени путь или шаблон. Если указать [site/css/*], распакуются только папка css и style.css.

unzip site.zip 'site/css/*' -d part
Archive:  site.zip
   creating: part/site/css/
  inflating: part/site/css/style.css

4️⃣ Ошибки unzip

  • ↪️ End-of-central-directory и нечитаемые имена файлов

Zip-файл, полученный с другого сервера, перед распаковкой проверьте через unzip -t. Если со сжатыми данными всё в порядке, у каждой записи выводится OK, а в последней строке — [No errors detected].

unzip -t site.zip
Archive:  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.zip
Archive:  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.gz
Archive:  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.zip
Archive:  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.zip
Archive:  report-win.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
       26  10-28-2026 22:10   보고서.txt
       17  10-28-2026 22:10   견적서.txt
---------                     -------
       43                     2 files
unzip -O CP949 report-win.zip -d win
Archive:  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.

Симулятор команды zipZip 3.0 · UnZip 6.00
[root@server work]#
Работает только в браузере и не сжимает настоящие файлы. Степени сжатия — измеренные значения, а для файлов, созданных в симуляторе, — оценочные. Клавишами ↑↓ можно вызвать ранее введённые команды.

🔢 FAQ & рекомендуемые материалы

Файл .gz, сжатый через gzip, в unzip завершился сообщением [End-of-central-directory signature not found]. После распаковки через [gzip -d readme.txt.gz] readme.txt.gz снова стал readme.txt. Файл .tar.gz, в котором несколько файлов упаковали через tar и затем сжали через gzip, распаковывают за один раз через tar.

На проверенном сервере AlmaLinux 9 zip и unzip были командами, установленными пакетами zip и unzip соответственно. Поэтому в семействе RHEL их устанавливают через [sudo dnf install zip unzip], а в семействе Debian — через [sudo apt install zip unzip] (по официальному списку пакетов Debian).

Укажите после unzip -p zip-файл и путь внутри него, и содержимое сразу выведется на экран. Запуск [unzip -p site.zip site/.htaccess] вывел только две строки .htaccess, не создав файл.

ℹ️ О партнёрских ссылках
Материалы этого сайта содержат партнёрские ссылки. Если посетитель покупает товар или услугу по такой ссылке, сайт получает комиссию от продавца. При этом сумма, которую платит покупатель (при акционных скидках сумма снижается ↓), не увеличивается. Указанные цены, скидки и наличие актуальны на момент написания и могут отличаться, поэтому перед покупкой уточняйте их у продавца. Товары выбираются и оцениваются по нашим собственным критериям, а комиссия не влияет ни на порядок, ни на содержание обзоров.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Докажите, что вы человек: 0   +   7   =