Werk transparant met gecomprimeerde bestanden

Linux kent allerlei tools om bewerkingen op gecomprimeerde bestanden uit te voeren. De collectie zutils zorgt er zelfs voor dat je niet eens meer hoeft te weten welk compressieformaat er gebruikt is.


Systeembeheerders zijn gewend dat alle belangrijke bestanden op een Linux-systeem tekstbestanden zijn, die ze kunnen bekijken met cat, more en less, kunnen vergelijken met diff en cmp en kunnen doorzoeken met grep. Maar wat als die bestanden nu eens gecomprimeerd zijn? Logrotate comprimeert bijvoorbeeld je logbestanden automatisch na een bepaalde tijd. Tegenwoordig zijn heel wat bestanden onder Linux gecomprimeerd, meestal in één van de drie bekendste compressieformaten: gzip, bzip2 of xz. Bijten dan al die klassieke Unix-tools hun tanden stuk op deze bestanden?

Gelukkig niet! Heel wat Linux-distributies installeren immers samen met de compressie- en decompressietools ook allerlei hulpmiddelen. Is het pakket gzip bijvoorbeeld geïnstalleerd, dan heb je hierdoor ook de beschikking over tools zoals zcat, zmore, zless, zdiff, zcmp en zgrep. Voor bzip2 zijn dat respectievelijk bzcat, bzmore, bzless, bzdiff, bzcmp en bzgrep, en voor xz zijn dat zoals je al verwacht xzcat, xzmore, xzless, xzdiff, xzcmp en xzgrep. Al deze tools doen hetzelfde als hun evenknieën zonder voorvoegsel, maar voegen transparante decompressie van de bestanden toe.

Geen mix

Een nadeel van deze tools is echter dat ze slechts één compressiealgoritme ondersteunen. Wil je bijvoorbeeld de inhoud van een .gz-bestand met de inhoud van een .bz2-bestand vergelijken, dan zal dat niet lukken: zowel zdiff als bzdiff kunnen maar één van beide bestanden lezen. Maar er is een nog essentiëler probleem: al deze tools kunnen niet eens met niet-gecomprimeerde bestanden overweg. Als je bijvoorbeeld zowel je al gecomprimeerde als de nog niet gecomprimeerde logbestanden na elkaar wil bekijken, dan zou je wellicht iets als het volgende proberen, dat echter een foutmelding geeft:



$ zcat /var/log/messages.{4..2}.gz /var/log/messages.1 /var/log/messages
[...]
gzip: /var/log/messages.1: not in gzip format
gzip: /var/log/messages: not in gzip format


Je moet voor de niet-gecomprimeerde bestanden cat gebruiken, en dan kom je tot een combinatie zoals het volgende, waarbij je de uitvoer van zcat als invoer aan cat doorgeeft en daar dan nog de niet-gecomprimeerde bestanden aan toevoegt:



$ zcat /var/log/messages.{4..2}.gz | cat - /var/log/messages.1 /var/log/messages


zutils

De oplossing voor de twee voorgaande problemen vind je in het pakket zutils[/b], een collectie tools die met elke combinatie van gecomprimeerde of ongecomprimeerde bestanden kan werken. Het pakket levert onder andere de programma's zcat, zcmp, zdiff, zgrep en ztest. Ze laten niet alleen toe om bijvoorbeeld .gz- en .bz2-bestanden door elkaar te gebruiken, maar ook gecomprimeerde en ongecomprimeerde bestanden door elkaar. Het eerste codevoorbeeld hierboven werkt dus wel als je zutils geïnstalleerd hebt, omdat je dan de zutils-versie van zcat hebt. Je hoeft dan bovendien niet te onthouden dat je voor .bz2-bestanden bzcat en dergelijke moet gebruiken, maar kunt voor elk ondersteund compressiealgoritme dezelfde tools gebruiken. Bekijk de handleiding online voor meer informatie over de mogelijkheden van de tools.

Je zult gemerkt hebben dat in de collectie zutils de programma's zmore en zless ontbreken. Dat is echter bewust gedaan. De auteur van zutils is niet van plan om deze te implementeren, omdat er al een beter alternatief bestaat: lesspipe. Dit is een preprocessor voor het programma less, die allerlei bestandsformaten ondersteunt, zoals gecomprimeerde bestanden, maar ook bijvoorbeeld .doc-bestanden. Veel Linux-distributies installeren lesspipe al standaard en configureren het om gecomprimeerde bestanden te ondersteunen, zodat je het vertrouwde less hiervoor kunt blijven gebruiken.