Lekce 13 - Linuxový terminál (Bash) - Archivace a komprese
V minulé lekci, Linuxový terminál (Bash) - Správa skupin a ACL, jsme se naučili vytvářet a spravovat skupiny. Dále jsme si vysvětlili, jakým způsobem můžeme přidělovat práva jednotlivým uživatelům pomocí ACL.
V dnešením Linux tutoriálu se naučíme, jak vytvářet a pracovat s archivem dat. Jinými slovy, naučíme se sloučit několik souborů či adresářů v jeden balíček. Archivace je důležitá a často používaná dovednost např. při zálohování dat nebo manipulaci s více soubory naráz (např. přeposílání po síti). Následně si ukážeme, jak pomocí komprese co nejvíce zmenšit velikost takového archivu.
Komprese
Kompresí (také komprimací) se snažíme zpracovat data tak, aby se
zmenšila jejich velikost. Můžeme se setkat s pojmem
kompresní poměr
. Jedná se o poměr velikosti zkomprimovaného
souboru k původnímu souboru. Čím vyšší poměr, tím více se
komprimovaný soubor zmenší oproti původnímu souboru. V této lekci se
budeme zabývat hlavně bezeztrátovou kompresí. To znamená,
že při dekompresi se soubor či adresář rekonstruuje do původní velikosti
bez ztráty dat. V praxi se využívá i ztrátová komprese. Používá se
např. při kompresi zvuku či videa, kde si ztráty dat nemusíme ani
všimnout. Výhodou je výrazně vyšší poměr komprese (zmenšení velikosti
souboru), než u bezeztrátové.
Archivace v grafickém prostředí
Nejprve si ukážeme, jak archivovat soubor v grafickém prostředí
(Nautilus). Pro tyto účely si nejprve vytvoříme adresář
Soubory/
do adresáře Documents/
:
mkdir /home/David/Documents/Soubory
Dále budeme potřebovat soubory, které budeme archivovat. Ty můžeme
vytvořit přímo v Nautilusu nebo pomocí příkazu touch
:
touch index.html style.css script.js
Otevřeme si adresář Soubory/
a vidíme zde naše tři
vytvořené soubory. V grafickém prostředí probíhá archivace podobně, jako
na jiných operačních systémech. Klikneme pravým tlačítkem na požadovaný
soubor, zvolíme možnost Compress…
a vybereme druh komprese:
Archivovat lze i více souborů najednou. Stačí označit všechny požadované a dál pokračovat stejným způsobem. Archivovat lze samozřejmě i celé adresáře či adresářovou strukturu.
Dekomprese v Nautilu
Pro dekompresi souboru klikneme pravým tlačítkem na archiv a zvolíme
extrahovat
.
Archivace v Terminálu
tar
Nejpoužívanější nástroj pro archivaci souborů v textovém rozhraní
Linuxu je program tar
. Jeho výhodou je, že archivace se provede
včetně nastavení vlastnictví, oprávnění souborů a adresářů a bývá
součástí většiny distribucí.
Archivace programem tar
Nejprve v terminálu přejdeme do adresáře Soubory/
vytvořeném v předchozí části. Příkazem ls
si ověříme,
že zde máme tři soubory. Pokud ne, vytvoříme je. Archivaci provedeme
pomocí příkazu tar
s přepínačem -cf
(create
file). Za ním následuje název archivu a nakonec archivovaný soubor nebo
adresář. Celý příkaz tedy vypadá takto:
tar -cf archiv.tar index.html
Soubor s názvem index.html
je nyní archivovaný v souboru
archiv.tar
.
Stejně jako v Nautilu i v terminálu lze archivovat několik souborů současně:
tar -cf archiv.tar index.html style.css script.js
Lze samozřejmě použít i regulární výrazy pro usnadnění zápisu.
Chceme-li např. archivovat pouze soubory s příponou .html
,
příkaz bude vypadat následovně:
tar -cf archiv.tar *.html
Vytvoříme-li ve stejném adresáři znovu soubor s názvem
archiv.tar
, přepíšeme ten původní.
Ignorování masky
Přidáním přepínače -p
se při následném rozbalení
ignorují masky. To znamená, že se zachovají původní uživatelské
oprávnění bez ohledu na to, kam se archiv rozbaluje:
tar -cpf archiv.tar *.html
Přepínač -f
bychom měli umístit vždy na konec
řady. V některých případech by jinak proces nemusel fungovat.
Zobrazení obsahu archivu
Jsou dvě varianty, jak zobrazit obsah archivu. První je pomocí
přepínače -tf
:
david@david:~/Documents/Soubory$ tar -tf archiv.tar
index.html
script.js
style.css
Druhá varianta je pomocí less
:
david@david:~/Documents/Soubory$ less archiv.tar -rw-rw-r-- vf/vf 0 2022-09-01 11:58 index.html -rw-rw-r-- vf/vf 0 2022-09-01 11:58 script.js -rw-rw-r-- vf/vf 0 2022-09-01 11:58 style.css
Odstranění souboru z archivu
Soubory obsažené v archivu můžeme jednotlivě vymazat. Pokud se
rozhodneme, že z našeho archivu chceme vyřadit soubor script.js
,
použijeme volbu --delete -f
:
tar --delete -f archiv.tar script.js
Po výpisu obsahu archivu zjistíme, že tento soubor v něm již není.
Přidání souboru do existujícího archivu
Pokud nastane situace, že potřebujeme zahrnout nový soubor do již
existujícího archivu, využijeme k tomu přepínač -rf
. Soubor
script.js
nyní vložíme zpět do našeho archivu:
tar -rf archiv.tar script.js
Vypsáním obsahu archivu si opět ověříme, zda akce proběhla úspěšně.
Extrahování archivu
Pro extrahování archivu slouží přepínač -xf
:
tar -xf archiv.tar
Je třeba dát pozor, kam archiv extrahujeme. Pokud bude cílový adresář obsahovat soubory nebo adresáře se stejným názvem, jako v archivu, extrahováním se přepíší. To naopak může být žádoucí, pokud obnovujeme data ze zálohy.
Chceme-li určit jiný adresář pro rozbalení archivu než ten, ve kterém
se nacházíme, přidáme přepínač -C
, Poté zadáme relativní
či absolutní cestu:
tar -xf archiv.tar -C /home/David/Desktop
Komprese programem tar
Program tar obsahuje několik nástrojů pro kompresi. Všechny jsou k
nalezení v manuálu v sekci Compression option
.
Nejpoužívanější nástroje jsou gzip
a bzip2
.
gzip
Komprese gzip
umožňuje cca o 15 % menší poměr komprese než
bzip2
. Na druhou stranu spotřebuje výrazně méně operační
paměti v průběhu komprese a je rychlejší. Je tedy vhodná tam, kde je
zapotřebí vysoká rychlost a nižší nároky na operační paměť. Archivy
komprimované pomocí gzip
mají většinou příponu
.tar.gz
nebo .tgz
.
Kompresi provedeme použitím přepínače -z
:
tar -czf archiv.tar.gz index.html style.css script.js
Linux si obecně, na rozdíl od Windows, na přípony souborů nepotrpí. Můžeme teoreticky zvolit jakoukoliv příponu chceme, případně nepoužít žádnou. Identifikování souboru pak ale bude velmi složité. Je tedy dobré zachovat konvence.
Dekomprese gzip archivu docílíme záměnou přepínače -c
za
-x
:
tar -xzf archiv.tar.gz
bzip2
Komprese pomocí bzip2
je náročnější na operační paměť
a doba komprese je delší než u gzip
. Pokud toto není na
překážku, výsledný archiv bude cca o 15 % menší. Soubor komprimovaný
pomocí bzip2
poznáme podle přípony .bz2
. Kompresi
docílíme přepínačem -j
:
tar -cjf archiv.tar.bz2 index.html
Dekompresi opět provedeme přepínačem -x
:
tar -xjf archiv.tar.bz2
Komprese programem zip
Zip je nejpoužívanější formát archivního souboru pro kompresi dat. Na
rozdíl od nástrojů programu tar
, zip
je
multiplatformní. Je vhodný, plánujeme-li přenést a použít archiv na
Windows nebo MAC a naopak. Archivy zip
nepodporují informace o
vlastnictví a oprávnění ve stylu Linuxu. Vlastnictví je vždy nastaveno
uživateli, který spouští příkaz. Pokud ovšem nemáme v plánu použít
archiv na jiné platformě, nástrojem gzip
dosáhneme daleko
lepšího poměru komprese.
Ubuntu standardně program zip obsahuje. Pokud terminál vrátí chybu:
bash: /usr/bin/zip: No such file or directory
Je nutné jej nejprve nainstalovat:
sudo apt install zip
Vytvoření archivu zip
Příkaz pro kompresi je podobný jako u tar
, jen není
zapotřebí přepínačů:
zip archiv.zip *
Regulárním výrazem *
jsme si usnadnili práci a
označili všechno, co se nachází v daném adresáři.
Pokud zapomeneme na příponu .zip
, přidá se k archivu
automaticky.
Zobrazení obsahu archivu zip
Pro zobrazení obsahu archivu můžeme využít less
:
david@david:~/Documents/Soubory$ less archiv.zip Archive: archiv.zip Length Method Size Cmpr Date Time CRC-32 Name -------- ------ ------- ---- ---------- ----- -------- ---- 0 Stored 0 0% 2022-09-01 11:58 00000000 index.html 0 Stored 0 0% 2022-09-01 11:58 00000000 script.js 0 Stored 0 0% 2022-09-01 11:58 00000000 style.css -------- ------- --- ------- 0 0 0% 3 files
Druhá varianta je příkaz unzip
s přepínačem
-l
(list):
david@david:~/Documents/Soubory$ unzip -l archive.zip Archive: archiv.zip Length Date Time Name --------- ---------- ----- ---- 0 2022-09-01 11:58 index.html 0 2022-09-01 11:58 script.js 0 2022-09-01 11:58 style.css --------- ------- 0 3 files
Rekurzivní komprese
Často potřebujeme komprimovat adresář včetně všech podadresářů.
Zatímco u tar
toto nemusíme řešit, u zip
toho
docílíme přepínačem -r
(recursive). Zkusíme takto archivovat
celý adresář Documents/
včetně podadresáře
Soubory/
:
zip -r archiv.zip Documents/
Zobrazením obsahu archivu si ověříme úspěšnost operace.
Zaheslování archivu zip
Další výhodou tohoto způsobu archivace je, že lze nastavit heslo. Heslo
nezabrání např. smazání souboru z archivu, pouze bude vyžadováno při
extrahování souborů. Heslo nastavíme přepínačem -e
(encript)
při vytváření archivu. Přesuneme se zpět do adresáře
Soubory/
a vytvoříme archiv s heslem:
zip -e zaheslovaný_archiv.zip index.html
Po zadání příkazu nás terminál vyzve k zadání hesla.
Odstranění souboru z archivu zip
Stejně, jako u kompresi tar
, i v tomto případě můžeme
odstranit jednotlivé soubory z archivu. Pro odstranění souboru
script.js
z našeho archivu archiv.zip
přidáme
přepínač -d
(delete):
zip -d archiv.zip script.js
Ověříme si, že soubor v archivu již není.
Přidání souboru do archivu zip
Pro přidání nového souboru do existujícího archivu slouží přepínač
-u
(update):
zip -u archiv.zip script.js
Opět si ověříme výpisem obsahu, že operace proběhla úspěšně.
Oprava poškozeného archivu zip
Může se stát, že se soubory v archivu poškodí. Po přidání
přepínače -F
(fix) se program zip
pokusí archiv
opravit a opravené soubory uloží do nového archivu. Nový archiv definujeme
--out opravený_archiv.zip
:
zip -F archiv.zip --out opravený_archiv.zip
Po vypsání obsahu adresáře uvidíme, že vedle původního archivu se
vytvořil nový s názvem opravený_archiv.zip
.
Dekomprese archivu zip
Soubory z archivu extrahujeme pomocí příkazu unzip
:
unzip archiv.zip
V případě zaheslovaného archivu nás terminál vyzve k zadání hesla.
V další lekci, Linuxový terminál (Bash) - Správa aplikací, se podíváme detailněji na aplikace. Vysvětlíme si, jak se program v Linuxu distribuuje, kde je uložený, jak se k němu dostat a jak s ním pracovat.