Polecenie zip: kompresja folderów, rozpakowywanie przez unzip i opcje kompresji
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
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.
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.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️⃣ Opcje polecenia zip
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 siteupdating: 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 $?12Aby 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.logLiczby 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 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| Poziom kompresji | Rozmiar pliku zip | Względem sumy oryginałów |
|---|---|---|
| Suma oryginalnych plików | 35 875 bajtów | 100% |
| -0 (bez kompresji) | 37 433 bajty | 104.3% |
| -6 (domyślny) | 4 179 bajtów | 11.6% |
| -9 (maksymalna kompresja) | 3 874 bajty | 10.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.txtEnter 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.zipArchive: 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 decArchive: secret.zip
[secret.zip] memo.txt password:
extracting: dec/memo.txt📌 Główne opcje: wyniki z tego artykułu
| Opcja | Zadanie | Wynik w tym artykule | |
|---|---|---|---|
| zip -r | Dodaje wszystkie podfoldery i pliki z folderu | Bez -r jeden wiersz adding: site/, z -r dziesięć wpisów razem z .htaccess | |
| zip -x | Pomija pliki pasujące do wzorca | Bez site/logs/* tylko osiem wpisów, bez folderu logs i access.log | |
| zip -u | Ponownie dodaje tylko pliki zmienione po utworzeniu pliku zip | Jeden wiersz updating: site/index.html (deflated 90%), bez zmian brak wyniku i kod wyjścia 12 | |
| zip -d | Usuwa wpisy z pliku zip | deleting: site/logs/ i deleting: site/logs/access.log | |
| zip -q | Ukrywa wiersze wypisywane podczas kompresji | Wszystkie trzy polecenia skompresowane z -qr (-0, domyślne, -9) kończą się bez wierszy adding | |
| zip -0 | Tylko zapisuje, bez kompresji | level0.zip ma 37433 bajty, więcej niż suma oryginałów | |
| zip -9 | Kompresuje najmocniej (domyślnie -6) | level9.zip 3874 bajty, level6.zip utworzony z ustawieniem domyślnym 4179 bajtów | |
| zip -e | Pyta o hasło i szyfruje zawartość | Pyta Enter password: i Verify password:, potem adding: memo.txt (stored 0%) | |
| unzip -l | Wypisuje listę zapisanych wpisów bez rozpakowywania | site.zip: 10 files, łącznie 35825 bajtów | |
| unzip -d | Wskazuje folder docelowy i tworzy go, jeśli nie istnieje | Zaczyna się od creating: restore/site/, a struktura folderu site rozpakowuje się pod restore | |
| unzip -o | Nadpisuje wszystkie istniejące pliki bez pytania | Pięć wierszy inflating bez pytań | |
| unzip -n | Pomija istniejące pliki bez pytania | Po wierszu Archive: site.zip nic się nie pojawia | |
| unzip -t | Sprawdza skompresowane dane bez rozpakowywania | OK przy każdym wpisie i No errors detected; ucięty broken.zip daje End-of-central-directory signature not found | |
| unzip -O | Wskazuje kodowanie znaków nazw plików w zip | Z -O CP949 zniekształcone nazwy wyświetlają się jako 보고서.txt i 견적서.txt (po koreańsku „raport” i „kosztorys”) | |
| unzip -p | Wysyła rozpakowaną zawartość na standardowe wyjście zamiast tworzyć pliki | Pojawiają się tylko dwa wiersze .htaccess, bez tworzenia pliku |
📎 Pozostałe opcje: według oficjalnego podręcznika
| Opcja | Zadanie | |
|---|---|---|
| zip -m | Usuwa oryginalne pliki i foldery po kompresji (dopiero gdy plik zip jest gotowy; oficjalna dokumentacja zaleca użycie razem z -T) | |
| zip -j | Zapisuje same nazwy plików, bez ścieżek folderów | |
| zip -y | Zapisuje dowiązanie symboliczne jako dowiązanie zamiast pliku, na który wskazuje | |
| zip -T | Sprawdza utworzony plik zip i nie zmienia oryginalnego pliku zip, jeśli test się nie powiedzie | |
| zip -f | Zastępuje zmienionymi plikami tylko wpisy już obecne w pliku zip i nie dodaje nowych plików | |
| zip -i | Dodaje tylko pliki pasujące do podanego wzorca | |
| zip -P | Wpisuje hasło bezpośrednio w wierszu poleceń (oficjalna dokumentacja ostrzega, że to niebezpieczne) | |
| unzip -j | Rozpakowuje same pliki do jednego folderu, bez tworzenia struktury folderów z zip | |
| unzip -x | Wskazuje wpisy, których nie rozpakowywać | |
| unzip -q | Ukrywa wiersze wypisywane podczas rozpakowywania | |
| unzip -u | Rozpakowuje tylko pliki, których brak na dysku, i pliki nowsze | |
| unzip -v | Dodaje do listy metodę kompresji, rozmiar po kompresji, stopień i CRC |
3️⃣ Jak używać polecenia unzip
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 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/.htaccessJeś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 restoreArchive: site.zip
replace restore/site/css/style.css? [y]es, [n]o, [A]ll, [N]one, [r]ename: NAby 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 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.zipRozpakowanie 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 partArchive: site.zip
creating: part/site/css/
inflating: part/site/css/style.css4️⃣ Błędy unzip
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.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.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.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 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.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.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.zipArchive: report-win.zip
Length Date Time Name
--------- ---------- ----- ----
26 10-28-2026 22:10 ║╕░э╝н.txt
17 10-28-2026 22:10 ░▀└√╝н.txt
--------- -------
43 2 filesJeś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.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/견적서.txtWedł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.
| Wynik | Znaczenie | Co sprawdzić dalej |
|---|---|---|
| End-of-central-directory signature not found | Nie znaleziono listy plików na końcu pliku zip – plik jest ucięty albo nie jest plikiem zip | Porównaj rozmiar z oryginałem i pobierz ponownie · tar.gz przez tar |
| cannot find or open | W bieżącym folderze nie ma pliku o tej nazwie | Nazwa i położenie pliku przez ls |
| skipping: … incorrect password | Hasł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 symbole | Nazwy zapisane w kodowaniu znaków Windows | To 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.
🔢 FAQ & polecane treści
WordPress · Wtyczki
Jak zainstalować wtyczkę WordPress: instalacja z wyszukiwarki, przesłanie pliku ZIP i włączenie
Kroki instalacji wtyczki z ekranu Dodaj wtyczkę – przez wyszukanie w oficjalnym katalogu albo przesłanie pliku zip.
Szukaj
Polecenie find w Linuksie
Polecenie find wyszukuje pliki według warunków takich jak nazwa, rozszerzenie, rozmiar i data, a potem wykonuje dalsze działania na znalezionych plikach.
Zarządzanie plikami
Opcje polecenia cp i zbiorcze nadpisywanie przy uruchamianiu
Opcje polecenia cp do kopiowania plików i katalogów oraz sposób kopiowania zbiorczego bez pytania o nadpisanie.
ℹ️ 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.