Jak zkomprimovat nebo rozbalit soubory z terminálu Linux

Photo of author

By etechblogcz

Archivy ZIP jsou široce využívaným formátem pro kompresi souborů v systémech Windows, macOS i Linux. V prostředí Linuxu máte k dispozici terminálové nástroje pro vytváření a rozbalování ZIP archivů.

Formát komprimovaných archivů ZIP

Díky své popularitě v prostředí Windows je formát ZIP nejrozšířenějším typem komprimovaných archivů na světě.

Ačkoli jsou v Linuxu běžné formáty jako .tar.gz a .tar.bz2, je pravděpodobné, že od uživatelů Windows obdržíte archiv ZIP. A pokud sami potřebujete archivovat soubory pro uživatele Windows, ZIP je pro ně nejjednodušším a nejkompatibilnějším řešením.

Nástroje zip, unzip a další

V Linuxu a systémech typu Unix, jako je macOS, existují nástroje zip a unzip, které slouží k tvorbě a extrakci ZIP archivů. Kromě nich existuje i sada dalších nástrojů, jako jsou zipcloak, zipdetails, zipsplit a zipinfo.

Při kontrole několika distribucí Linuxu jsme zjistili, zda jsou tyto nástroje součástí standardní instalace. V Ubuntu 19.04, 18.10 a 18.04 byly přítomny všechny. Stejně tak i v Manjaro 18.04. Fedora 29 a CentOS obsahovaly pouze zip a unzip.

Pro instalaci chybějících nástrojů ve Fedoře 29 použijte:

sudo dnf install perl-IO-Compress

Pro instalaci chybějících nástrojů v CentOS 7 použijte:

sudo yum install perl-IO-Compress

Pokud v některé z vámi používaných distribucí Linuxu tyto nástroje chybí, použijte pro instalaci správce balíčků vaší distribuce.

Vytváření ZIP archivů pomocí příkazu zip

Pro vytvoření ZIP archivu je třeba příkazu zip specifikovat jméno vytvářeného archivu a soubory, které do něj mají být zahrnuty. Příponu „.zip“ není nutné zadávat, ale není chybou ji přidat.

Chcete-li vytvořit archiv s názvem source_code.zip obsahující všechny soubory zdrojového kódu C a hlavičkové soubory v aktuálním adresáři, použijte následující příkaz:

zip source_code *.c *.h

Po přidání každého souboru se zobrazí jeho název a míra komprese.

Při pohledu na nově vytvořený archiv je vidět, že přípona „.zip“ byla přidána automaticky.

ls -l source_code.zip

Pokud si nepřejete vidět výstup během vytváření archivu, použijte volbu -q (tichý režim).

zip -q source_code *.c *.h

Zahrnutí adresářů do ZIP archivů

Pro zahrnutí podadresářů do archivu ZIP použijte volbu -r (rekurzivně) a zadejte název podadresáře na příkazový řádek. Chcete-li tedy vytvořit archiv a zahrnout do něj podadresář archive, použijte:

zip -r -q source_code archive/ *.c *.h

Pro usnadnění extrahování obsahu archivu pro příjemce je často vhodné vytvářet ZIP soubory tak, aby soubory byly uvnitř umístěny v adresáři. Při extrakci tak budou všechny soubory přehledně uloženy v adresáři.

V následujícím příkazu archivujeme pracovní adresář a všechny jeho podadresáře. Příkaz je spuštěn z nadřazeného adresáře pracovní složky.

zip -r -q source_code work/

Nastavení úrovně komprese

Při vytváření archivu ZIP můžete ovlivnit míru komprese souborů. Rozsah komprese je od 0 do 9, kde 0 znamená žádnou kompresi. Čím vyšší komprese, tím déle trvá vytvoření archivu. U menších archivů není časový rozdíl příliš velký, výchozí komprese (úroveň 6) je obvykle dostatečná.

Pro použití určité úrovně komprese použijte číslo s předponou „-“ jako volbu:

zip -0 -r -q source_code work/

Výchozí úroveň komprese je 6. Není nutné ji specifikovat, ale pokud tak učiníte, nebude to mít negativní dopad.

zip -r -q source_code work/

Maximální úroveň komprese je 9.

zip -9 -r -q source_code work/

Při archivaci souborů a adresářů může být rozdíl mezi žádnou kompresí (úroveň 0) a výchozí kompresí (úroveň 6) například 400 kB. Rozdíl mezi výchozí kompresí a maximální kompresí (úroveň 9) může být například jen 4 kB.

U archivů obsahujících stovky nebo tisíce souborů se i malé zvýšení komprese může projevit jako významná úspora místa.

Přidávání hesel do ZIP archivů

Přidání hesla do ZIP archivu je jednoduché. Použijte volbu -e (šifrovat) a budete vyzváni k zadání hesla a jeho ověření.

zip -e -r -q source_code work/

Rozbalování ZIP archivu pomocí příkazu unzip

Pro extrahování souborů ze ZIP archivu použijte příkaz unzip s názvem souboru. Nezapomeňte na příponu „.zip“.

unzip source_code.zip

Při extrahování se vypisují názvy souborů do terminálu.

ZIP archivy neuchovávají informace o vlastnictví souborů. Po extrakci je vlastníkem všech souborů uživatel, který provádí extrakci.

Podobně jako příkaz zip má i unzip volbu -q (tichý režim), která potlačuje výpis extrahovaných souborů.

unzip -q source_code.zip

Extrakce souborů do cílového adresáře

Pro extrakci souborů do konkrétního adresáře použijte volbu -d (directory) a zadejte cestu k požadovanému adresáři.

unzip -q source_code.zip -d ./development

Extrahování heslem chráněných ZIP archivů

Pokud byl ZIP archiv vytvořen s heslem, unzip vás o něj požádá. Bez správného hesla extrakce nebude provedena.

unzip -q source_code.zip

Pokud vám nevadí, že je heslo vidět nebo uloženo v historii příkazů, můžete ho zadat přímo na příkazovém řádku pomocí volby -P (password). (Použijte velké „P“.)

unzip -P fifty.treacle.cutlass -q source_code.zip

Vyloučení souborů

Pokud nechcete extrahovat konkrétní soubory nebo skupiny souborů, použijte volbu -x (exclude). Například pro extrakci všech souborů kromě těch, které mají příponu „.h“:

unzip -q source_code.zip -x *.h

Přepisování souborů

Představte si, že jste extrahovali archiv, ale omylem jste smazali některé z extrahovaných souborů.

Rychlým řešením by bylo soubory znovu extrahovat. Při opakované extrakci do stejného adresáře vás unzip vyzve k rozhodnutí o přepsání souborů. Očekává se jedna z následujících odpovědí.

Kromě odpovědi r (přejmenovat) jsou ostatní odpovědi rozlišovány malými a velkými písmeny.

y: Ano, přepsat tento soubor
n: Ne, nepřepisovat tento soubor
A: Vše, přepsat všechny soubory
N: Žádný, nepřepisovat žádný ze souborů
r: Přejmenovat, extrahovat tento soubor s novým názvem. Budete vyzváni k zadání nového jména.

Pro přepsání existujících souborů bez dotazování použijte volbu -o (overwrite).

unzip -o -q source_code.zip

Nejefektivnějším způsobem, jak obnovit chybějící soubory, je extrahovat pouze ty, které v cílovém adresáři nejsou. Pro to použijte volbu -n (never overwrite).

unzip -n source_code.zip

Náhled obsahu ZIP archivu

Je často užitečné zobrazit seznam souborů uvnitř ZIP archivu před jeho rozbalením. K tomu použijte volbu -l (list archive). Výstup je vhodné přesměrovat do less pro snadnější procházení.

unzip -l source_code.zip | less

Výstup zobrazí adresáře a soubory v ZIP archivu, jejich velikost, čas a datum přidání do archivu. Pro ukončení z less stiskněte „q“.

Existují i další způsoby, jak nahlédnout do ZIP archivu, které poskytují různé typy informací, jak uvidíme dále.

Přidání hesla pomocí příkazu zipcloak

Co dělat, pokud jste vytvořili ZIP archiv a zapomněli jste na heslo? Můžete ho rychle přidat pomocí příkazu zipcloak. Stačí zadat název ZIP archivu a budete vyzváni k zadání a ověření hesla.

zipcloak source_code.zip

Zobrazení detailů ZIP archivu pomocí příkazu zipdetails

Příkaz zipdetails zobrazí podrobné informace o ZIP archivu. Pro zobrazení velkého množství výstupu je vhodné přesměrovat jej do less.

zipdetails source_code.zip | less

Informace zahrnují jména souborů, i když je archiv chráněn heslem. Tento typ informací je uložen v ZIP archivu jako metadata a není součástí šifrovaných dat.

Hledání v ZIP archivu pomocí příkazu zipgrep

Příkaz zipgrep umožňuje vyhledávat text v souborech uvnitř ZIP archivu. Například pro zjištění, které soubory obsahují text „keyval.h“:

zipgrep keyval.h source_code.zip

Z výstupu je vidět, že soubory slang.c a getval.c obsahují řetězec „keyval.h“. Také vidíme, že v ZIP archivu jsou dvě kopie každého z těchto souborů v různých adresářích.

Zobrazení informací pomocí příkazu zipinfo

Příkaz zipinfo nabízí další způsob, jak nahlédnout do ZIP archivu. Stejně jako u ostatních příkazů je výstup vhodné přesměrovat do less.

zipinfo source_code.zip | less

Výstup zleva doprava zobrazuje:

Práva souborů
Verzi nástroje použitého pro vytvoření ZIP archivu
Původní velikost souboru
Deskriptor souboru (popsáno níže)
Způsob komprese (v tomto případě deflace)
Datum a čas
Název souboru a případného adresáře

Deskriptor souboru se skládá ze dvou znaků. První znak je „t“ nebo „b“ pro textový nebo binární soubor. Pokud je velké písmeno, soubor je šifrován. Druhý znak představuje typ metadat: žádné, rozšířené místní záhlaví, „extra pole“ nebo obojí.

-: Žádné z uvedeného
l: Existuje rozšířené místní záhlaví, ale ne „extra pole“
x: Neexistuje rozšířené místní záhlaví, ale existuje „extra pole“
X: Existuje rozšířené místní záhlaví i „extra pole“

Rozdělení ZIP archivu pomocí příkazu zipsplit

Pokud potřebujete poslat ZIP archiv a máte problémy s omezenou velikostí, můžete použít příkaz zipsplit pro jeho rozdělení na sadu menších ZIP archivů.

Volba -n (velikost) umožní nastavit maximální velikost pro jednotlivé nové ZIP archivy. V tomto příkladu dělíme source_code.zip tak, že žádný nový archiv nebude větší než 100 kB (102 400 bajtů).

zipsplit -n 102400 source_code.zip

Zvolená velikost nemůže být menší než velikost největšího souboru v ZIP archivu.

Pomocí těchto příkazů můžete vytvářet vlastní ZIP archivy, rozbalovat přijaté archivy a provádět s nimi různé operace bez nutnosti opustit terminál v Linuxu.