Polecenie zip: kompresja folderów, rozpakowywanie przez unzip i opcje kompresji

Środowisko testoweRodzina RHELAlmaLinux 9.8konto rootSprawdzono 2026-11-05
Polecenia kompresji · archiwizacjizipunzipLokalizacja/usr/bin/zip
Kompresja folderów i rozpakowywanie przez unzip

Polecenie zip łączy w Linuksie pliki i foldery w jeden skompresowany plik zip, a do rozpakowania używa się razem z nim unzip. Na serwerze AlmaLinux 9 folder strony internetowej skompresowany przez zip -r zmniejszył się z 35 825 bajtów do 4 158 bajtów, a unzip -O naprawił zniekształcone nazwy plików w pliku zip utworzonym w Windows.

Poniższe wyniki pochodzą z folderu roboczego na serwerze AlmaLinux 9.8, uruchomione na koncie root, z czasem w UTC. Skompresowany folder site i pliki notatek to przykładowe pliki utworzone do testu. Plik zip z Windows odtworzono za pomocą pliku testowego, w którym nazwy plików zapisano w CP949.

1️⃣ Jak używać polecenia zip

  • ↪️ Kompresja plików i folderów (-r)

Po zip wpisz najpierw nazwę nowego pliku zip, a potem wymień pliki, które mają do niego trafić. Poniższe polecenie kompresuje dwa pliki, readme.txt i memo.txt, do jednego notes.zip.

zip notes.zip readme.txt memo.txt
  adding: readme.txt (deflated 92%)
  adding: memo.txt (stored 0%)

[deflated 92%] na końcu wiersza to stopień zmniejszenia pliku względem rozmiaru oryginalnego. [stored 0%] w wierszu 71-bajtowego memo.txt oznacza, że plik zapisano w oryginalnym rozmiarze, bez kompresji.

Aby skompresować folder, dodaj -r. Jeśli bez -r podasz tylko nazwę folderu, do archiwum trafi wyłącznie wpis folderu site/, bez plików w środku.

zip nodir.zip site
  adding: site/ (stored 0%)

Folder site do skompresowania składa się, jak poniżej, z trzech podfolderów i sześciu plików.

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

Z -r trafia do archiwum wszystkie dziesięć wpisów: podfoldery, pliki w nich, a nawet .htaccess, którego nazwa zaczyna się od kropki.

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%)

Zawartość gotowego pliku zip sprawdzisz bez rozpakowywania za pomocą unzip -l. Zapisane pliki miały łącznie 35 825 bajtów, a ls -l pokazał site.zip o rozmiarze 4 158 bajtów.

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️⃣ Opcje polecenia zip

  • ↪️ -x, -u, -d, poziom kompresji, -e

Spośród opcji polecenia zip -x pomija pliki pasujące do wzorca. Po podaniu [site/logs/*], aby pominąć folder logów, odpadają folder logs i access.log, a do archiwum trafia tylko osiem wpisów.

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%)

Ujmij wzorzec w apostrofy, aby powłoka nie zamieniła najpierw [*] na nazwy plików. Oficjalna dokumentacja w tym samym celu podaje przykład z ukośnikiem odwrotnym przed [*].

-u ponownie dodaje tylko pliki zmienione po utworzeniu pliku zip. Po dopisaniu jednego wiersza na końcu index.html uruchomienie z -ru dodaje ponownie tylko ten jeden plik jako [updating].

zip -ru site.zip site
updating: site/index.html (deflated 90%)

Ponowne uruchomienie tego samego polecenia bez zmienionych plików nic nie wypisało, a kod wyjścia wyniósł 12. W oficjalnej dokumentacji 12 oznacza, że zip nie ma nic do zrobienia.

zip -ru site.zip site; echo $?
12

Aby usunąć wpisy z pliku zip, użyj -d. Po podaniu [site/logs/*] z site.zip znikają wpis folderu logs i access.log.

zip -d site.zip 'site/logs/*'
deleting: site/logs/
deleting: site/logs/access.log

Liczby od -0 do -9 to poziom kompresji, a według oficjalnej dokumentacji domyślny jest -6. Ten sam folder site skompresowano trzy razy z -q, bez wypisywania, aby porównać rozmiary. Ponieważ podczas testu -u dopisano wiersz do index.html, suma oryginalnych plików wynosi teraz 35 875 bajtów.

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
Poziom kompresjiRozmiar pliku zipWzględem sumy oryginałów
Suma oryginalnych plików35 875 bajtów100%
-0 (bez kompresji)37 433 bajty104.3%
-6 (domyślny)4 179 bajtów11.6%
-9 (maksymalna kompresja)3 874 bajty10.8%

37 433 bajty uzyskane z -0 były większe niż suma oryginałów, 35 875 bajtów. To rozmiar nieskompresowanych danych plus 1 558 bajtów nagłówków, takich jak nazwy plików i czasy, dołączanych do każdego wpisu. -9 dało plik o 305 bajtów mniejszy niż ustawienie domyślne, a cała różnica pochodziła z największego pliku, access.log.

Aby ustawić hasło, dodaj -e. Hasło wpisujesz dwa razy, a wpisywane znaki nie pojawiają się na ekranie.

zip -e secret.zip memo.txt
Enter password:
Verify password:
  adding: memo.txt (stored 0%)

Nawet secret.zip utworzony z -e pokazał w unzip -l nazwy, rozmiary i daty plików bez hasła. Szyfrowana jest tylko zawartość plików, więc nie nadaje się to do materiałów, w których ukryte muszą być także nazwy plików.

unzip -l secret.zip
Archive:  secret.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
       71  10-28-2026 22:10   memo.txt
---------                     -------
       71                     1 file

-P, które wpisuje hasło bezpośrednio w wierszu poleceń, to opcja, przed którą oficjalna dokumentacja ostrzega jako niebezpieczną, bo inni użytkownicy tego samego serwera mogą widzieć uruchomione polecenia. Dokumentacja opisuje też samo standardowe szyfrowanie zip jako stosunkowo słabe.

Przy rozpakowywaniu pliku zip utworzonego z -e unzip pyta o hasło do każdego pliku, a po wpisaniu poprawnego hasła plik zostaje rozpakowany.

unzip secret.zip -d dec
Archive:  secret.zip
[secret.zip] memo.txt password:
 extracting: dec/memo.txt

📌 Główne opcje: wyniki z tego artykułu

OpcjaZadanieWynik w tym artykule
zip -rDodaje wszystkie podfoldery i pliki z folderuBez -r jeden wiersz adding: site/, z -r dziesięć wpisów razem z .htaccess
zip -xPomija pliki pasujące do wzorcaBez site/logs/* tylko osiem wpisów, bez folderu logs i access.log
zip -uPonownie dodaje tylko pliki zmienione po utworzeniu pliku zipJeden wiersz updating: site/index.html (deflated 90%), bez zmian brak wyniku i kod wyjścia 12
zip -dUsuwa wpisy z pliku zipdeleting: site/logs/ i deleting: site/logs/access.log
zip -qUkrywa wiersze wypisywane podczas kompresjiWszystkie trzy polecenia skompresowane z -qr (-0, domyślne, -9) kończą się bez wierszy adding
zip -0Tylko zapisuje, bez kompresjilevel0.zip ma 37433 bajty, więcej niż suma oryginałów
zip -9Kompresuje najmocniej (domyślnie -6)level9.zip 3874 bajty, level6.zip utworzony z ustawieniem domyślnym 4179 bajtów
zip -ePyta o hasło i szyfruje zawartośćPyta Enter password: i Verify password:, potem adding: memo.txt (stored 0%)
unzip -lWypisuje listę zapisanych wpisów bez rozpakowywaniasite.zip: 10 files, łącznie 35825 bajtów
unzip -dWskazuje folder docelowy i tworzy go, jeśli nie istniejeZaczyna się od creating: restore/site/, a struktura folderu site rozpakowuje się pod restore
unzip -oNadpisuje wszystkie istniejące pliki bez pytaniaPięć wierszy inflating bez pytań
unzip -nPomija istniejące pliki bez pytaniaPo wierszu Archive: site.zip nic się nie pojawia
unzip -tSprawdza skompresowane dane bez rozpakowywaniaOK przy każdym wpisie i No errors detected; ucięty broken.zip daje End-of-central-directory signature not found
unzip -OWskazuje kodowanie znaków nazw plików w zipZ -O CP949 zniekształcone nazwy wyświetlają się jako 보고서.txt i 견적서.txt (po koreańsku „raport” i „kosztorys”)
unzip -pWysyła rozpakowaną zawartość na standardowe wyjście zamiast tworzyć plikiPojawiają się tylko dwa wiersze .htaccess, bez tworzenia pliku

📎 Pozostałe opcje: według oficjalnego podręcznika

OpcjaZadanie
zip -mUsuwa oryginalne pliki i foldery po kompresji (dopiero gdy plik zip jest gotowy; oficjalna dokumentacja zaleca użycie razem z -T)
zip -jZapisuje same nazwy plików, bez ścieżek folderów
zip -yZapisuje dowiązanie symboliczne jako dowiązanie zamiast pliku, na który wskazuje
zip -TSprawdza utworzony plik zip i nie zmienia oryginalnego pliku zip, jeśli test się nie powiedzie
zip -fZastępuje zmienionymi plikami tylko wpisy już obecne w pliku zip i nie dodaje nowych plików
zip -iDodaje tylko pliki pasujące do podanego wzorca
zip -PWpisuje hasło bezpośrednio w wierszu poleceń (oficjalna dokumentacja ostrzega, że to niebezpieczne)
unzip -jRozpakowuje same pliki do jednego folderu, bez tworzenia struktury folderów z zip
unzip -xWskazuje wpisy, których nie rozpakowywać
unzip -qUkrywa wiersze wypisywane podczas rozpakowywania
unzip -uRozpakowuje tylko pliki, których brak na dysku, i pliki nowsze
unzip -vDodaje do listy metodę kompresji, rozmiar po kompresji, stopień i CRC

3️⃣ Jak używać polecenia unzip

  • ↪️ Rozpakowywanie zip w Linuksie oraz -d, -o i -n

Aby rozpakować plik zip w Linuksie, wpisz nazwę pliku zip po unzip. Bez -d, które wskazuje folder, pliki rozpakowują się do bieżącego folderu (według oficjalnej dokumentacji), dlatego tym razem wskazano folder 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

Jeśli folder podany w -d nie istnieje, unzip go tworzy i rozpakowuje pod nim strukturę folderu site bez zmian.

Gdy rozpakujesz ponownie w to samo miejsce, unzip zatrzymuje się przy każdym istniejącym pliku i pyta, czy go nadpisać. Wybranie [N]one kończy działanie bez nadpisania żadnego z pozostałych plików.

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

Aby obyło się bez pytań, dodaj -o lub -n. -o nadpisuje wszystkie istniejące pliki, a -n je pomija. Ponieważ oficjalna dokumentacja wymienia -o jako opcję niebezpieczną, najpierw sprawdź, czy folder można nadpisać, i dopiero wtedy dodaj -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

Rozpakowanie z -n tam, gdzie wszystkie pliki już istnieją, nie wypisuje nic po wierszu Archive.

Aby rozpakować tylko część pliku zip, wpisz po nazwie pliku zip ścieżkę lub wzorzec. Po podaniu [site/css/*] rozpakowują się tylko folder css i style.css.

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

4️⃣ Błędy unzip

  • ↪️ End-of-central-directory i zniekształcone nazwy plików

Plik zip otrzymany z innego serwera sprawdź przed rozpakowaniem przez unzip -t. Jeśli skompresowane dane są w porządku, przy każdym wpisie pojawia się OK, a w ostatnim wierszu [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.

Plik zip, któremu przerwany transfer uciął koniec, zakończył się komunikatem [End-of-central-directory signature not found]. To wynik sprawdzenia przez -t pliku broken.zip, w którym zostawiono tylko pierwsze 2 000 bajtów site.zip; site.zip miał 2 436 bajtów po usunięciu wpisów logs przez -d.

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 najpierw czyta listę plików na samym końcu pliku zip (central directory). Dlatego w broken.zip z uciętym końcem nie zdołał sprawdzić nawet pierwszego wpisu.

Plik, który nie jest zip, dał ten sam komunikat. site.tar.gz spakowany przez tar zakończył się w unzip tym samym błędem, a pliki tar.gz rozpakowuje polecenie 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.

Plik zip utworzony w Windows czasem zapisuje nazwy plików w kodowaniu znaków Windows zamiast w UTF-8. Gdy report-win.zip z nazwami zapisanymi w CP949 otwarto przez unzip -l na serwerze z UTF-8, nazwy plików pojawiły się jako nieczytelne symbole.

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

Jeśli po -O wpiszesz kodowanie znaków Windows, w którym utworzono plik zip, nazwy wyświetlą się poprawnie, a pliki rozpakowane z tą samą opcją powstaną z oryginalnymi nazwami.

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

Według pomocy unzip -O to opcja dla plików zip utworzonych w DOS i Windows, a -I dla plików zip z innych systemów.

Poniżej są komunikaty błędów, które pojawiły się przy rozpakowywaniu, i to, co sprawdzić dalej.

WynikZnaczenieCo sprawdzić dalej
End-of-central-directory signature not foundNie znaleziono listy plików na końcu pliku zip – plik jest ucięty albo nie jest plikiem zipPorównaj rozmiar z oryginałem i pobierz ponownie · tar.gz przez tar
cannot find or openW bieżącym folderze nie ma pliku o tej nazwieNazwa i położenie pliku przez ls
skipping: … incorrect passwordHasło trzy razy błędne, ten plik pominięto (kod wyjścia 82)Wielkość liter w haśle i język wprowadzania
Nazwy plików zamieniają się w symboleNazwy zapisane w kodowaniu znaków WindowsTo kodowanie (np. CP949) po -O

🔲 Symulator polecenia zip

W symulatorze poniżej możesz sam wpisać kolejne kroki: kompresję przez zip, a potem listowanie lub rozpakowywanie przez unzip.

Symulator polecenia zipZip 3.0 · UnZip 6.00
[root@server work]#
Działa tylko w przeglądarce i nie kompresuje prawdziwych plików. Stopnie kompresji to wartości zmierzone, a dla plików nowo utworzonych w symulatorze to wartości szacunkowe. Strzałkami ↑↓ przywołasz wcześniej wpisane polecenia.

🔢 FAQ & polecane treści

Plik .gz skompresowany przez gzip zakończył się w unzip komunikatem [End-of-central-directory signature not found]. Po rozpakowaniu przez [gzip -d readme.txt.gz] readme.txt.gz znów stał się readme.txt. Plik .tar.gz, w którym kilka plików spakowano przez tar, a potem skompresowano przez gzip, rozpakowuje się za jednym razem przez tar.

Na sprawdzonym serwerze AlmaLinux 9 zip i unzip były poleceniami zainstalowanymi odpowiednio przez pakiety zip i unzip. Dlatego w systemach z rodziny RHEL instalujesz je przez [sudo dnf install zip unzip], a w systemach z rodziny Debian przez [sudo apt install zip unzip] (według oficjalnej listy pakietów Debiana).

Wpisz po unzip -p plik zip i ścieżkę w nim, a zawartość pojawi się od razu na ekranie. Uruchomienie [unzip -p site.zip site/.htaccess] wypisało tylko dwa wiersze .htaccess, bez tworzenia pliku.

ℹ️ Informacja o linkach partnerskich
Treści tej witryny zawierają linki partnerskie. Jeśli odwiedzający kupi produkt lub usługę przez taki link, witryna otrzymuje od sprzedawcy prowizję. Kwota płacona przy tym przez kupującego (podczas promocji spada↓) nie wzrasta. Podane ceny, rabaty i dostępność odnoszą się do chwili pisania i mogą różnić się od stanu faktycznego, dlatego przed zakupem sprawdź je u sprzedawcy. Produkty wybieramy i oceniamy według własnych kryteriów, a prowizja nie wpływa ani na kolejność prezentacji, ani na treść ocen.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Wymagane pola są oznaczone *

Prove your humanity: 9   +   7   =