Mester tar-kommandoen: 15 nyttige eksempler for Linux

Tar er et av de mest brukte filarkiveringsformatene i Unix- og Linux-miljøer.

Navnet stammer fra «Tape Archive», ettersom det opprinnelig ble designet for å lagre data sekvensielt på båndstasjoner. Det refereres også til som en «tarball».

Standard tar-funksjonen er å arkivere filer uten komprimering, men det brukes ofte i kombinasjon med komprimeringsteknikker. Verktøyet «tar» er som regel inkludert som standard i de fleste Linux-distribusjoner, og formatet er kompatibelt med andre operativsystemer, som Windows og macOS, gjennom forskjellige programmer og verktøy.

I denne artikkelen skal vi se nærmere på noen vanlige eksempler og bruksområder for tar-kommandoen og de tilhørende flaggene.

La oss starte…

Opprettelse av et tar-arkiv

Grunnleggende syntaks for å lage et enkelt, ukomprimert arkiv ser slik ut:

$ tar cvf <arkivnavn.tar> <filer_som_skal_arkiveres>

Her betyr «c» opprettelse, «v» gir en detaljert utskrift, og «f» spesifiserer navnet på tar-arkivet. Det er vanlig å bruke filtypen .tar for tar-filer. Filene som skal arkiveres kan angis enten med jokertegn eller som enkelte filnavn eller stier.

La oss se på et eksempel. Jeg har tre filer i min katalog:

$ ls -l
total 12
-rw-r--r-- 1 bruker bruker 13 Sep 12 20:08 fil1.txt
-rw-r--r-- 1 bruker bruker 19 Sep 12 20:08 fil2.txt
-rw-r--r-- 1 bruker bruker 24 Sep 12 20:08 fil3.txt
$

For å lage et tar-arkiv som inneholder alle tre filene, kan jeg bruke kommandoen:

$ tar cvf archive.tar *
fil1.txt
fil2.txt
fil3.txt
$ ls -l archive.tar
-rw-r--r-- 1 bruker bruker 10240 Sep 12 20:15 archive.tar
$

Jeg kan også velge å arkivere bestemte filer, slik som:

$ tar cvf arkiv1.tar fil1.txt fil2.txt
fil1.txt
fil2.txt
$ ls -l arkiv1.tar
-rw-r--r-- 1 bruker bruker 10240 Sep 12 20:15 arkiv1.tar
$

Lage komprimerte arkiver (GZ)

I tillegg til å arkivere filer, kan tar også komprimere dem for å spare diskplass. Et vanlig komprimeringsformat er gunzip, som ofte har filtypen .gz etter .tar, eller som .tgz. Vi kan bruke flagget «z» for å indikere at filene skal komprimeres med gunzip. Her er et eksempel:

$ tar cvzf arkiv.tar.gz fil*
fil1.txt
fil2.txt
fil3.txt
$ ls -l arkiv.tar arkiv.tar.gz
-rw-r--r-- 1 bruker bruker 10240 Sep 12 20:15 arkiv.tar
-rw-r--r-- 1 bruker bruker   188 Sep 12 20:21 arkiv.tar.gz
$

Det er tydelig at størrelsen på de to arkivfilene er svært forskjellig, selv om begge inneholder de samme tre filene. Dette skyldes komprimeringen med «z»-flagget.

Lage komprimerte arkiver (BZ2)

Tar støtter også flere andre komprimeringsformater, deriblant bz2 eller bzip2, som ofte har filendelsen .tar.bz2 eller noen ganger .tbz2. Dette kan gi mindre arkivstørrelser, men krever mer CPU, noe som kan gjøre komprimering og dekomprimering tregere enn med gz-arkiver.

Eksempel:

$ tar cvjf arkiv.tar.bz2 fil*
fil1.txt
fil2.txt
fil3.txt
$ ls -l arkiv.tar arkiv.tar.gz arkiv.tar.bz2
-rw-r--r-- 1 bruker bruker 10240 Sep 12 20:15 arkiv.tar
-rw-r--r-- 1 bruker bruker   212 Sep 12 20:25 arkiv.tar.bz2
-rw-r--r-- 1 bruker bruker   188 Sep 12 20:21 arkiv.tar.gz
$ file arkiv.tar*
arkiv.tar:     POSIX tar archive (GNU)
arkiv.tar.bz2: bzip2 compressed data, block size = 900k
arkiv.tar.gz:  gzip compressed data, from Unix, original size modulo 2^32 10240
$

Uttrekking av alle filer

Et tar-arkiv (enten det er komprimert eller ikke) kan enkelt pakkes ut med «x»-alternativet. Følgende eksempler viser bruken:

$ tar xvf arkiv.tar
fil1.txt
fil2.txt
fil3.txt
$ ls -l
total 24
-rw-r--r-- 1 bruker bruker 10240 Sep 19 18:25 arkiv.tar
-rw-r--r-- 1 bruker bruker    13 Sep 12 20:08 fil1.txt
-rw-r--r-- 1 bruker bruker    19 Sep 12 20:08 fil2.txt
-rw-r--r-- 1 bruker bruker    24 Sep 12 20:08 fil3.txt
$

Dette fungerer også for et gz-komprimert arkiv:

$ tar xvf arkiv.tar.gz
fil1.txt
fil2.txt
fil3.txt
$ ls -l
total 16
-rw-r--r-- 1 bruker bruker 188 Sep 19 18:27 arkiv.tar.gz
-rw-r--r-- 1 bruker bruker  13 Sep 12 20:08 fil1.txt
-rw-r--r-- 1 bruker bruker  19 Sep 12 20:08 fil2.txt
-rw-r--r-- 1 bruker bruker  24 Sep 12 20:08 fil3.txt
$

Eller for et bz2-komprimert arkiv:

$ tar xvf arkiv.tar.bz2
fil1.txt
fil2.txt
fil3.txt
$ ls -l
total 16
-rw-r--r-- 1 bruker bruker 212 Sep 19 18:31 arkiv.tar.bz2
-rw-r--r-- 1 bruker bruker  13 Sep 12 20:08 fil1.txt
-rw-r--r-- 1 bruker bruker  19 Sep 12 20:08 fil2.txt
-rw-r--r-- 1 bruker bruker  24 Sep 12 20:08 fil3.txt
$

Liste innhold i tar-arkivet

For å se innholdet i et tar-arkiv, kan du bruke flagget «t», som vist nedenfor:

$ tar tvf arkiv.tar.bz2
-rw-r--r-- bruker/bruker 13 2021-09-12 20:08 fil1.txt
-rw-r--r-- bruker/bruker 19 2021-09-12 20:08 fil2.txt
-rw-r--r-- bruker/bruker 24 2021-09-12 20:08 fil3.txt
$

Pakke ut bestemte filer

Du kan pakke ut enkeltfiler fra et tar-, tar.gz- eller tar.bz2-arkiv ved å spesifisere filnavnet:

$ tar xvf arkiv.tar.bz2 fil1.txt
fil1.txt
$ ls -l
total 8
-rw-r--r-- 1 bruker bruker 212 Sep 19 18:31 arkiv.tar.bz2
-rw-r--r-- 1 bruker bruker  13 Sep 12 20:08 fil1.txt
$

Tilsvarende kan du pakke ut flere filer ved å liste filnavnene med mellomrom mellom:

$ tar xvf arkiv.tar.bz2 fil1.txt fil3.txt
fil1.txt
fil3.txt
$ ls -l
total 12
-rw-r--r-- 1 bruker bruker 212 Sep 19 18:31 arkiv.tar.bz2
-rw-r--r-- 1 bruker bruker  13 Sep 12 20:08 fil1.txt
-rw-r--r-- 1 bruker bruker  24 Sep 12 20:08 fil3.txt
$

Pakke ut med jokertegn

For å pakke ut en eller flere filer som matcher et jokertegnmønster, kan du bruke –wildcards-flagget:

$ tar xvf arkiv.tar.bz2 --wildcards "fil*"
fil1.txt
fil2.txt
fil3.txt
$ ls -l
total 16
-rw-r--r-- 1 bruker bruker 212 Sep 19 18:31 arkiv.tar.bz2
-rw-r--r-- 1 bruker bruker  13 Sep 12 20:08 fil1.txt
-rw-r--r-- 1 bruker bruker  19 Sep 12 20:08 fil2.txt
-rw-r--r-- 1 bruker bruker  24 Sep 12 20:08 fil3.txt
$

Legge til filer i arkiv

Du kan legge til nye filer i eksisterende ukomprimerte tar-arkiver ved å bruke «r» eller –append-flagget med nye filnavn eller jokertegn (dette fungerer kun med ukomprimerte .tar-filer, ikke med komprimerte formater som tar.gz eller tar.bz2):

$ tar rvf arkiv.tar fil-ny*
fil-ny.txt
fil-ny2.txt
$ tar tvf arkiv.tar
-rw-r--r-- bruker/bruker 13 2021-09-12 20:08 fil1.txt
-rw-r--r-- bruker/bruker 19 2021-09-12 20:08 fil2.txt
-rw-r--r-- bruker/bruker 24 2021-09-12 20:08 fil3.txt
-rw-r--r-- bruker/bruker 15 2021-09-19 18:59 fil2.txt
-rw-r--r-- bruker/bruker 10 2021-09-19 18:58 fil4.txt
-rw-r--r-- bruker/bruker  9 2021-09-19 19:10 fil-ny.txt
-rw-r--r-- bruker/bruker  9 2021-09-19 19:10 fil-ny2.txt
$

Du kan se at innholdsfortegnelsen for arkiv.tar nå viser de to nylig tilføyde filene.

Slette filer fra arkivet

Det er mulig å fjerne spesifikke filer fra et tar-arkiv ved å bruke –delete-flagget (sammenlign innholdet før og etter sletting):

$ tar tvf arkiv.tar
-rw-r--r-- bruker/bruker 13 2021-09-12 20:08 fil1.txt
-rw-r--r-- bruker/bruker 19 2021-09-12 20:08 fil2.txt
-rw-r--r-- bruker/bruker 24 2021-09-12 20:08 fil3.txt
-rw-r--r-- bruker/bruker 15 2021-09-19 18:59 fil2.txt
-rw-r--r-- bruker/bruker 10 2021-09-19 18:58 fil4.txt
-rw-r--r-- bruker/bruker  9 2021-09-19 19:10 fil-ny.txt
-rw-r--r-- bruker/bruker  9 2021-09-19 19:10 fil-ny2.txt
$ tar --delete -f arkiv.tar fil-ny.txt fil-ny2.txt
$ tar tvf arkiv.tar
-rw-r--r-- bruker/bruker 13 2021-09-12 20:08 fil1.txt
-rw-r--r-- bruker/bruker 19 2021-09-12 20:08 fil2.txt
-rw-r--r-- bruker/bruker 24 2021-09-12 20:08 fil3.txt
-rw-r--r-- bruker/bruker 15 2021-09-19 18:59 fil2.txt
-rw-r--r-- bruker/bruker 10 2021-09-19 18:58 fil4.txt
$

Dette fungerer igjen kun med ukomprimerte tar-arkiver, ikke med komprimerte formater.

Opprett med verifisering

Når du lager ukomprimerte tar-filer, kan du validere innholdet i arkivet med «W»-flagget:

$ tar cvfW arkiv.tar fil*.txt
fil1.txt
fil2.txt
fil3.txt
Bekreft fil1.txt
Bekreft fil2.txt
Bekreft fil3.txt
$

Dette kan ikke brukes med komprimeringsflagg, men du kan komprimere den opprettede tar-filen senere med gzip eller andre verktøy.

Pakke ut til en mappe

Hvis du vil pakke ut innholdet i tar-arkivet til en bestemt mappe i stedet for gjeldende katalog, bruk -C-flagget med mappebanen:

$ tar xvf arkiv.tar -C ny-mappe/
fil1.txt
fil2.txt
fil3.txt
fil2.txt
fil4.txt
$ ls -l ny-mappe/
total 16
-rw-r--r-- 1 bruker bruker 13 Sep 12 20:08 fil1.txt
-rw-r--r-- 1 bruker bruker 15 Sep 19 18:59 fil2.txt
-rw-r--r-- 1 bruker bruker 24 Sep 12 20:08 fil3.txt
-rw-r--r-- 1 bruker bruker 10 Sep 19 18:58 fil4.txt
$

Bruk diff-flagget

Du kan bruke –diff- eller «d»-flagget for å sjekke eventuelle forskjeller mellom filene i tar-arkivet og de i filsystemet. Her er et eksempel som kjører diff en gang når filen i tar-arkivet og den utenfor var identiske. Etter at filen ble oppdatert, ble den kjørt på nytt for å vise endringene i utdataene.

$ tar dvf arkiv.tar fil4.txt
fil4.txt
$
$ echo ny linje > fil4.txt
$
$ tar dvf arkiv.tar fil4.txt
fil4.txt
fil4.txt: Endret tidspunkt
fil4.txt: Ulik størrelse
$

Ekskludere filer

Det kan være nødvendig å ekskludere bestemte filer når du oppretter tar-arkiver. Dette kan gjøres med –exclude-flagget.

$ tar --exclude="mappe/fil2.txt" --exclude="mappe/fil-ny*.txt" -cvzf arkiv.tar.gz mappe/
mappe/
mappe/fil1.txt
mappe/fil3.txt
$ ls -l mappe
total 24
-rw-r--r-- 1 bruker bruker 9 Sep 19 19:10 fil-ny.txt
-rw-r--r-- 1 bruker bruker 9 Sep 19 19:10 fil-ny2.txt
-rw-r--r-- 1 bruker bruker 5 Sep 19 19:20 fil-ny3.txt
-rw-r--r-- 1 bruker bruker 5 Sep 19 19:27 fil1.txt
-rw-r--r-- 1 bruker bruker 6 Sep 19 19:27 fil2.txt
-rw-r--r-- 1 bruker bruker 8 Sep 19 19:27 fil3.txt
$ tar tvf arkiv.tar.gz
drwxr-xr-x bruker/bruker 0 2021-09-19 19:30 mappe/
-rw-r--r-- bruker/bruker 5 2021-09-19 19:27 mappe/fil1.txt
-rw-r--r-- bruker/bruker 8 2021-09-19 19:27 mappe/fil3.txt
$

Som du ser, kan du bruke –exclude-flagget flere ganger for å spesifisere flere filnavn eller mønstre med AND-logikk. I eksemplet ovenfor var det kun to av de seks filene i mappen som tilfredsstilte betingelsen for å bli inkludert i arkiv.at.gz.

Se størrelse på tar-innhold

Vi kan se størrelsen på innholdet i et komprimert tar-arkiv ved å bruke følgende kommando:

$ tar tvf arkiv.tar.gz
-rw-r--r-- bruker/bruker 13 2021-09-12 20:08 fil1.txt
-rw-r--r-- bruker/bruker 19 2021-09-12 20:08 fil2.txt
-rw-r--r-- bruker/bruker 24 2021-09-12 20:08 fil3.txt
$ tar -xzf arkiv.tar.gz --to-stdout|wc -c
56
$

Tilsvarende for bz2-arkiv:

$ tar tvf arkiv.tar.bz2
-rw-r--r-- bruker/bruker 13 2021-09-12 20:08 fil1.txt
-rw-r--r-- bruker/bruker 19 2021-09-12 20:08 fil2.txt
-rw-r--r-- bruker/bruker 24 2021-09-12 20:08 fil3.txt
$ tar -xjf arkiv.tar.bz2 --to-stdout|wc -c
56
$

Bevar tillatelser

Som standard beholder tar-kommandoen fil- og mappetillatelser når den arkiverer. Du kan eksplisitt angi det samme med -p-flagget eller –preserve-permissions, som vist nedenfor:

$ tar cvpzf arkiv.tar.gz *.txt
fil1.txt
fil2.txt
fil3.txt
$

Oppsummering 👨‍💻

Tar har vært et essensielt verktøy i Unix/Linux-systemer i lang tid, og det ble opprinnelig brukt til arkivering og sikkerhetskopiering. Verktøyet har utviklet seg over tid med mange alternativer. Det kan brukes til både enkle og komplekse oppgaver, så lenge du kjenner funksjonene det tilbyr. Denne artikkelen har gjennomgått noen av de grunnleggende operasjonene du kan utføre med tar-kommandoen, og hvordan den kan hjelpe deg med daglige systemadministrasjonsoppgaver.

Sjekk man-siden for tar (man tar), eller bruk «tar –help» eller «tar –usage» for mer informasjon.