Hlavní navigace

Unixová komprese v praxi: Gzip

22. 4. 2003
Doba čtení: 6 minut

Sdílet

Vypadá to, že se nám náš seriálek pěkně rozjíždí. Tak ať nám to vydrží. Dneska se podíváme na zoubek v současnosti nejpoužívanějšímu kompresnímu programu, který se jmenuje gzip.

Jak možná někteří z vás tuší, protože jsem to naznačil už minule, gzip není jeden program, ale jedná se o celou rodinku programů pro práci s komprimovanými soubory. Gzip je samozřejmě tím hlavním, nikoliv však jediným zajímavým, kouskem. Používáte-li Linux, určitě gzip ve své oblíbené distribuci najdete. Pokud ale dáváte přednost jinému Unixu, případně některému systému od Microsoftu či Apple, můžete si už zkompilovaný balíček stáhnout na domovských stránkách projektu. Jsou zde předkompilované balíčky pro více než 20 platforem. Zdrojové kódy, manuál, často kladené otázky, případně kontakty na autory naleznete tamtéž.

Gzip vznikl jako náhrada za již zastaralý compress, přičemž ve většině případů dosahuje lepších kompresních poměrů a je navíc zbaven všech problémů s patenty. Časem jej vzal pod svá křídla GNU projekt, a tak se stal i součástí linuxových distribucí. Jeho autory jsou pánové Jean-loup Gailly a Mark Adler.

Poslední verze gzipu je 1.3.3, která je ve fázi testování, odstraňuje několik vážných bezpečnostních chyb a zároveň přidává některé nové vymoženosti. Jednou z nich je například podpora souborů větších než 2GB. Toť informace ze stránek www.gzip.org. V posledním Debianu (Sarge) se však objevila verze gzipu 1.3.5, což si sice neumím úplně vysvětlit (jedině snad tak, že se autoři gzipu nestarají o svůj web), nicméně odstraňuje minimálně jednu vážnou chybu u zforce (viz dále v článku). Samotný kompresní algoritmus, který gzip používá, se jmenuje Lempel-Ziv (LZ77). Balík obsahuje tyto spustitelné soubory: gzip, gunzip, zcat, gzexe, zcmp, zdiff, zgrep, zegrep, zfgrep, zforce, zless, zmore, znew. Jak vidíte, je jich hodně, takže se do nich hned pustíme.

gzip ztělesňuje samotný kompresní algoritmus. Jeho základní použití je velmi podobné jako u compressu:

gzip soubor

nám původní soubor nahradí komprimovaným, za jehož názvem se nám navíc objeví přípona (.gz). Samotný gzip bez parametrů začne načítat data ze standardního vstupu a posílat je v komprimované podobě na výstup. Toho můžeme jednoduše využít v rourách:

cat soubor | gzip > soubor.gz

Také náš starý známý tar si s gzipem dobře rozumí, stačí mu mezi parametry vložit písmeno malé z a už se při vytváření respektive rozbalování archivu automaticky používá gzip. Jenom jako příklad:

tar -xzf soubor.tar.gz

nám dekomprimuje a zároveň rozbalí celý archív. Ještě zopakuju, že se často místo spojení dvou přípon .tar.gz používá jedna přípona .tgz a takovému souboru se pak říká tarball. Z parametrů uvedu ten nejdůležitější, číslo, které určuje stupeň komprese, a to od –1 pro nejrychlejší, ale nejméně účinnou, až po –9 pro nejúčinnější, ale nejpomalejší kompresi. Standardně je přednastaven stupeň šest. Pro ostatní parametry vás pošlu nakouknout do manuálových stránek.

gunzip je podobně jako uncompress utilitka pro dekompresi datového toku. Používá se víceméně stejně jako gzip.

zcat má v podstatě stejnou funkci jako klacický cat (obsah souboru zadaného parametrem vypíše na standardní výstup) s tím rozdílem, že před výstupem ještě obsah prožene gunzipem. Použití může vypadat třeba takhle:

zcat soubor.gz > rozbaleny_soubor

Takto lze použít zcat namísto gunzipu, ale můžeme jej například využít i ke čtení komprimovaných textů. Já mám třeba na svém disku soubory s obsahem všech CD své distribuce. Protože jsou to skvělá data ke kompresi, jsou soubory pochopitelně komprimovány gzipem. Pokud v nich hledám například soubor s instalací xpexesa, abych vědel, které CD vložit, na řádku napíšu:

zcat seznam_cd1.gz | grep 'xpexeso'
gzexe

je hodně zajímavá utilita, která se může hodit všem, kdož mají málo místa na disku a chtěli by něco ušetřit. Použití je jednoduché:

gzexe nejaka_binarka

Na disku se nám objeví navíc soubor s názvem nejaka_binarka~, což je kopie původního souboru. Ten nový, který vznikne, se bude jmenovat stejně jako původní, takže v našem případě nejaka_binarka. Vtip je v tom, že náš nový soubor je komprimován gzipem a při pokusu o jeho spuštění se tento sám dekomprimuje a spustí. A to bez našeho zásahu a zcela transparentně. Tím pádem můžeme soubor s vlnovkou smazat a elegantně ušetříme diskovou kapacitu.

Pro zájemce ještě o tom, jak to vlastně funguje: Gzexe soubor nejprve klasicky zkomprimuje a pak na jeho začátek přidá jednoduchý skript napsaný v bashi. Ten se postará o to, že se při spuštění celý soubor zkopíruje do tempu, tam se samotný skript „odřízne“ a celé se to rozbalí, spustí a smaže. Jednoduché a krásně funkční.

zcmp a zdiff jsou si hodně podobné, tak je vezmeme najednou. Jsou stejně jako cmp a diff určeny k porovnání dvou souborů, které se jim jako parametry „podstrčí“. Rozdíl je „pouze“ v tom, že se v tomto případě zadávají komprimované soubory a porovnává se jejich nekomprimovaný obsah. Pokud se jim zadá jen jeden soubor:

zcmp soubor1.txt

porovnávají se soubory soubor1.txt a soubor1.txt.gz s tím, že se pochopitelně dekomprimuje jen ten jeden. Pokud se jako parametry zadají dva soubory, dekomprimují se oba. Pak se porovnají a na výstupu dostaneme informace o rozdílech.

zgrep, zegrep, zfgrep jsou programy určené k prohledání komprimovaného souboru (přesněji opět v jeho dekomprimované podobě) a vyhledání řádek, ve kterých se nachází specifikovaný výraz. Tyto řádky jsou pak vypsány na výstup. Pokud použiji příklad se soubory s výpisem obsahu CD, pak můžu zápis změnit takto:

zgrep xpexeso seznam_cd*

k zegrep a zfgrep snad jenom tolik, že reprezentují stejnou funkci jako zgrep -E a zgrep -F (mění způsob zadání vyhledávaného výrazu). Jejich popis je nad rámec tohoto článku a kompletně jsou popsány v manuálových stránkách.

zforce mi způsobil největší potíže. V gzip verze 1.3.3 (kterou mám já) totiž nedělá, co by měl (neboli nedělá pro jistotu vůbec nic). Jedná se nejspíš o nějakou chybku, která je ve verzi 1.3.5 (Debian Sarge) již odstraněna. zforce slouží k přidání přípon u souborů, které jsou komprimovány gzipem. K odstranění přípony může dojít například při přenosu dat nebo při kopírování na souborový systém, který nepodporuje tak dlouhé názvy, jako má daný soubor. Následně je tedy přebytečná část „odseknuta“ a název je i s příponou zkrácen.

Pak nastupuje zforce. Ten prochází soubory, které mu zadáme v parametrech, a pokud jsou komprimovány a nemají některou z přípon .z, .gz nebo .tgz, přidá k jejich názvu příponu .gz . Příjemné je také to, že pokud při přejmenovávání souboru zjistí, že název souboru je dlouhý a zabírá maximální délku, jakou mu umožňuje souborový systém, zforce ještě sám zkrátí jeho název tak, aby se vešla i přípona .gz.

zmore a zless slouží ke čtení komprimovaných textů, jejichž výpis je potřeba zastavit, protože jsou dlouhé a nevejdou se naráz na obrazovku. Můžeme je použít v rourách, například za příkazem cat, ale jednodušší je, pokud jim jako parametr předáme přímo název komprimovaného souboru:

zmore komprese4.txt.gz

Rozdíl mezi nimi je ten, že zmore umožňuje jednoduché zastavení výpisu a posun pouze dolů a zless vám navíc dovolí listovat nahoru, dolů, vyhledávat v textu a podobně.

root_podpora

znew je posledním prográmkem z balíku gzip a umožňuje překomprimovat soubory komprimované pomocí compress na soubory gzip. Jako parametr mu stačí zadat název souboru s příponou .Z a on se už postará o všechno ostatní a místo souboru .Z nám na disku zůstane soubor s příponou .gz . Lze samozřejmě použít i zástupné znaky jako * a ? pro zpracování více souborů najednou.

Tím naše přehlídka gzpiovacích utilitek končí. Příště si řekneme něco o velmi zajímevém komprimátoru zvaném bzip2, který se za těch několik málo let, co existuje, stal vážným konkurentem gzipu.

Byl pro vás článek přínosný?

Autor článku

Petr Krčmář pracuje jako šéfredaktor serveru Root.cz. Studoval počítače a média, takže je rozpolcen mezi dva obory. Snaží se dělat obojí, jak nejlépe umí.