Komprimer filer i Linux-terminalen: zip, unzip & flere verktøy

ZIP-filer er et standardisert arkivformat som ofte benyttes i Windows, macOS, og til og med Linux-systemer. Med enkle terminalkommandoer i Linux kan man enkelt opprette ZIP-arkiver eller pakke ut filer fra eksisterende arkiver.

ZIP-komprimert arkivformat

På grunn av den utbredte bruken av ZIP-formatet i Windows-verdenen, er det sannsynligvis den mest vanlige formen for komprimert arkiv globalt.

Selv om .tar.gz- og .tar.bz2-filer er vanlige i Linux-miljøet, vil Windows-brukere oftere sende deg et arkiv i ZIP-format. Skal du sende arkiverte filer til en Windows-bruker, er ZIP-formatet den enkleste og mest kompatible løsningen for alle parter.

`zip`, `unzip` og tilhørende verktøy

Som du kanskje vet, tilbyr Linux og Unix-lignende systemer, som macOS, verktøy for å opprette og pakke ut ZIP-filer; disse heter `zip` og `unzip`. Det finnes også en hel familie av relaterte verktøy, som `zipcloak`, `zipdetails`, `zipsplit` og `zipinfo`.

Vi har undersøkt et par Linux-distribusjoner for å se om disse verktøyene er inkludert i standardinstallasjonen. Alle verktøyene var til stede i Ubuntu 19.04, 18.10 og 18.04. De var også inkludert i Manjaro 18.04. Fedora 29 inkluderte kun `zip` og `unzip`, det samme var tilfellet med CentOS.

For å installere de manglende elementene på Fedora 29, bruker du følgende kommando:

sudo dnf install perl-IO-Compress

For å installere de manglende elementene på CentOS 7, bruker du denne kommandoen:

sudo yum install perl-IO-Compress

Hvis noen av zip-verktøyene mangler i en Linux-distribusjon som ikke er nevnt her, bruker du pakkebehandlingsverktøyet til din Linux-distribusjon for å installere nødvendige pakker.

Slik oppretter du en ZIP-fil med `zip`-kommandoen

For å opprette en ZIP-fil, må du fortelle `zip` hva filen skal hete og hvilke filer som skal inkluderes. Du trenger ikke legge til filendelsen «.zip», men det skader ikke om du gjør det.

For å lage en fil kalt `source_code.zip` som inneholder alle C-kildekodefiler og headerfiler i gjeldende mappe, bruk denne kommandoen:

zip source_code *.c *.h

Hver fil listes opp etterhvert som den legges til. Navnet på filen og mengden komprimering vises.

Ved å undersøke det nye ZIP-arkivet, ser du at filtypen «.zip» er lagt til automatisk av `zip`.

ls -l source_code.zip

Dersom du ikke ønsker å se utskriften fra `zip` ved opprettelse av ZIP-filen, bruk alternativet `-q` (quiet).

zip -q source_code *.c *.h

Inkludering av mapper i ZIP-filer

For å inkludere undermapper i ZIP-filen, bruk alternativet `-r` (rekursivt) og inkluder navnet på undermappen i kommandolinjen. For å opprette en ZIP-fil som tidligere, og i tillegg inkludere undermappen `archive`, bruk denne kommandoen:

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

For å være hensynsfull med mottakeren av ZIP-filen, er det ofte lurt å opprette ZIP-filer der filene ligger inne i en egen mappe. Da vil alle filer automatisk havne i en ryddig mappe ved utpakking av ZIP-filen.

I den neste kommandoen arkiverer vi arbeidsmappen og alle undermapper. Merk at denne kommandoen kjøres fra overordnet mappe til arbeidsmappen.

zip -r -q source_code work/

Justering av kompresjonsnivå

Du kan velge hvor mye komprimering som skal brukes på filene når de legges til ZIP-arkivet. Området er fra 0 til 9, der 0 betyr ingen komprimering. Jo høyere komprimering, desto lengre tid tar det å opprette ZIP-filen. For ZIP-filer av moderat størrelse, er ikke forskjellen i tid særlig stor. Og for filer av denne størrelsen, er standard komprimering (nivå 6) som regel god nok.

For at `zip` skal bruke et spesifikt komprimeringsnivå, sender du nummeret som et alternativ på kommandolinjen, med en «-«, som dette:

zip -0 -r -q source_code work/

Standard komprimeringsnivå er 6. Det er ikke nødvendig å spesifisere `-6`, men det skader ikke å gjøre det.

zip -r -q source_code work/

Maksimalt komprimeringsnivå er nivå 9.

zip -9 -r -q source_code work/

Med det valget av filer og mapper som arkiveres her, er forskjellen mellom ingen komprimering (nivå 0) og standard komprimering (nivå 6) 400KB. Forskjellen mellom standard komprimering og høyeste komprimeringsnivå (nivå 9) er bare 4KB.

Det virker kanskje ikke så mye, men for arkiver som inneholder hundrevis eller til og med tusenvis av filer, vil den lille mengden ekstra komprimering per fil gi en verdifull plassbesparelse.

Legge til passord i ZIP-filer

Det er enkelt å legge til passord i ZIP-filer. Bruk alternativet `-e` (krypter), og du vil bli bedt om å skrive inn passordet ditt, og bekrefte det.

zip -e -r -q source_code work/

Slik pakker du ut en ZIP-fil med `unzip`-kommandoen

For å pakke ut filer fra en ZIP-fil, bruker du `unzip`-kommandoen og angir navnet på ZIP-filen. Husk å inkludere «.zip»-endelsen.

unzip source_code.zip

Filene vises i terminalvinduet etterhvert som de pakkes ut.

ZIP-filer inneholder ikke informasjon om eierskap til filer. Alle filer som pakkes ut, vil bli eid av brukeren som pakker dem ut.

Akkurat som `zip`, har `unzip` et `-q` (quiet) alternativ, slik at du slipper å se filutskriften mens filene pakkes ut.

unzip -q source_code.zip

Pakk ut filer til en bestemt mappe

For å pakke ut filer til en spesifikk mappe, bruk `-d` (directory) alternativet, og oppgi stien til mappen du vil pakke ut arkivet til.

unzip -q source_code.zip -d ./development

Pakk ut passordbeskyttede ZIP-filer

Dersom en ZIP-fil er opprettet med et passord, vil `unzip` spørre etter passordet. Hvis du ikke angir riktig passord, vil ikke filene pakkes ut.

unzip -q source_code.zip

Hvis du ikke bryr deg om at passordet ditt vises til andre – og heller ikke at det lagres i kommandohistorikken din – kan du oppgi passordet i kommandolinjen med alternativet `-P` (password). (Husk stor «P»).

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

Ekskluder filer

Hvis du ikke ønsker å pakke ut en bestemt fil eller gruppe med filer, bruker du alternativet `-x` (exclude). I dette eksemplet vil vi pakke ut alle filene bortsett fra de som slutter på filtypen «.h».

unzip -q source_code.zip -x *.h

Overskriv filer

Anta at du har pakket ut et arkiv, men har slettet noen av de utpakkede filene ved en feil.

En rask løsning ville være å pakke ut filene på nytt. Men dersom du prøver å pakke ut ZIP-filen i samme mappe som tidligere, vil `unzip` be om en beslutning om overskriving av filene. Kommandoen vil forvente en av følgende svar:

Med unntak av `r`-svaret (gi nytt navn), skiller disse svarene mellom store og små bokstaver.

y: Ja, overskriv filen.
n: Nei, ikke overskriv filen.
A: Alle, overskriv alle filer.
N: Ingen, ikke overskriv noen av filene.
r: Gi nytt navn, pakk ut filen, men gi den et nytt navn. Du vil bli bedt om et nytt filnavn.

For å tvinge utpakking til å overskrive eksisterende filer, bruk `-o` (overwrite) alternativet.

unzip -o -q source_code.zip

Den mest effektive måten å erstatte de manglende filene på, ville være å pakke ut filer fra arkivet som ikke eksisterer i målmappen. For å gjøre dette, bruk `-n` (never overwrite) alternativet.

unzip -n source_code.zip

Se innholdet i en ZIP-fil

Det er ofte nyttig å se en liste over filene i en ZIP-fil før man pakker den ut. Du kan gjøre dette med `-l` (list archive) alternativet. Resultatet føres gjennom `less` for en enklere oversikt.

unzip -l source_code.zip | less

Utskriften viser mappene og filene i ZIP-filen, størrelsen, klokkeslett og dato de ble lagt til i arkivet. Trykk «q» for å avslutte `less`.

Det er andre måter å undersøke en ZIP-fil, som gir forskjellige typer informasjon, som vi skal se.

Legge til passord med `zipcloak`-kommandoen

Hva gjør du dersom du har opprettet en ZIP-fil og glemt å legge til passord? Du kan enkelt legge til passord i en eksisterende ZIP-fil med `zipcloak`-kommandoen. Send navnet på ZIP-filen som parameter i kommandolinjen. Du vil bli bedt om et passord. Bekreft passordet ved å skrive det inn på nytt.

zipcloak source_code.zip

Vis fildetaljer med `zipdetails`-kommandoen

`zipdetails`-kommandoen vil vise deg mye informasjon om ZIP-filen. Den eneste praktiske måten å håndtere mengden utskrift denne kommandoen kan gi, er å føre den gjennom `less`.

zipdetails source_code.zip | less

Merk at informasjonen vil inkludere filnavn selv om ZIP-filen er passordbeskyttet. Denne informasjonen lagres som metadata i ZIP-filen, og er ikke en del av de krypterte dataene.

Søk i filer med `zipgrep`-kommandoen

`zipgrep`-kommandoen lar deg søke i filene i en ZIP-fil. I det følgende eksemplet ønsker vi å vite hvilke filer i ZIP-filen som inneholder teksten «keyval.h».

zipgrep keyval.h source_code.zip

Vi ser at filene `slang.c` og `getval.c` inneholder strengen «keyval.h». Vi ser også at det finnes to kopier av hver fil i ulike mapper i ZIP-filen.

Vis informasjon med `zipinfo`-kommandoen

`zipinfo`-kommandoen gir deg enda en måte å se innholdet i en ZIP-fil. Som tidligere, fører vi utskriften gjennom `less`.

zipinfo source_code.zip | less

Fra venstre mot høyre viser utskriften:

Filrettighetene.
Versjonen av verktøyet som ble brukt til å opprette ZIP-filen.
Den opprinnelige filstørrelsen.
En filbeskrivelse (beskrevet under).
Metoden for komprimering (deflasjon, i dette tilfellet).
Dato og tidsstempel.
Navnet på filen og eventuell mappe.

Filbeskrivelsen består av to tegn. Det første tegnet vil være en «t» eller en «b» for å indikere en tekstfil eller binærfil. Hvis det er en stor bokstav, er filen kryptert. Det andre tegnet kan være ett av fire tegn. Dette tegnet representerer hvilken type metadata som er inkludert for denne filen: ingen, en utvidet lokal overskrift, et «ekstra felt», eller begge deler.

-: Hvis ingen av dem eksisterer, vil tegnet være en bindestrek.
l: hvis det er en utvidet lokal overskrift, men ikke noe ekstra felt.
x: hvis det ikke er noen utvidet lokal overskrift, men det er et ekstra felt.
X: hvis det er en utvidet lokal overskrift og et ekstra felt.

Del en fil med `zipsplit`-kommandoen

Dersom du trenger å sende ZIP-filen til noen andre, men det finnes begrensninger på størrelsen eller problemer med overføringen, kan du bruke `zipsplit`-kommandoen for å dele den originale ZIP-filen i et sett med mindre ZIP-filer.

Alternativet `-n` (size) lar deg angi maksimal størrelse for hver av de nye ZIP-filene. I dette eksemplet deler vi filen `source_code.zip`. Vi vil ikke at noen av de nye ZIP-filene skal være større enn 100 KB (102400 byte).

zipsplit -n 102400 source_code.zip

Størrelsen du velger kan ikke være mindre enn størrelsen på noen av filene i ZIP-filen.

Med disse kommandoene kan du opprette dine egne ZIP-filer, pakke ut ZIP-filer du mottar, og utføre mange andre operasjoner på filene uten å forlate Linux-terminalen.