tar — standardna Linux arhiva

Ime je skraćeno od tape archive — nastao je za pisanje na magnetne trake. Traka je odavno nestala, a tar je ostao, jer radi jednu stvar koju nijedan drugi format ne radi tako dobro: pakuje ceo direktorijum u jedan fajl, uz čuvanje dozvola, vlasništva i simboličkih linkova.

Zato je backup Linux sistema gotovo uvek tar arhiva.

Tri komande koje su dovoljne

$ tar -czf arhiva.tar.gz direktorijum/     # napravi
$ tar -tf arhiva.tar.gz                    # pogledaj sadržaj
$ tar -xf arhiva.tar.gz                    # raspakuj

Sve ostalo na ovoj stranici su varijacije. Ako zapamtiš samo ove tri, u devedeset odsto slučajeva ti je dovoljno.

Šta znače slova

-c create — napravi arhivu
-x extract — raspakuj
-t list — samo prikaži sadržaj
-f file — ime arhive dolazi odmah iza
-v verbose — ispiši svaki fajl
-z / -j / -J gzip / bzip2 / xz

Prva tri se međusobno isključuju — biraš tačno jedno. Slovo -f mora biti poslednje u grupi, jer ime fajla ide odmah iza njega:

$ tar -czf arhiva.tar.gz dir/     # ispravno
$ tar -cfz arhiva.tar.gz dir/     # tar pokusava da napravi fajl "z"

Zašto se ponekad piše bez crtice

$ tar czf arhiva.tar.gz dir/

Radi isto. tar je stariji od dogovora o crticama, pa prihvata oba oblika. Crtica je čitljivija i u primerima je bolje koristiti nju.

Pravljenje arhive

$ tar -czvf sajt.tar.gz /var/www/sajt
tar: Removing leading `/' from member names
var/www/sajt/
var/www/sajt/index.html
var/www/sajt/css/style.css

Poruka o kosoj crti nije greška nego zaštita. Kad bi tar čuvao apsolutne putanje, raspakivanje bi prepisalo sistemske fajlove bez obzira na to gde se nalaziš. Ovako se arhiva uvek raspakuje relativno.

Zbog toga se sistemska arhiva vraća iz korena:

$ cd /
$ sudo tar -xpf sajt.tar.gz

Bolji način: -C

$ tar -czf sajt.tar.gz -C /var/www sajt

Opcija -C menja direktorijum pre pakovanja. Rezultat je arhiva u kojoj je sajt/ na vrhu, bez var/www/ iznad. Preglednije je i lakše za vraćanje na drugo mesto.

Više izvora odjednom

$ tar -czf konfiguracija.tar.gz /etc/nginx /etc/ssh /etc/hosts

Bez kompresije

$ tar -cf slike.tar slike/

Ako su unutra JPEG ili MP4 fajlovi, kompresija ne donosi ništa — samo troši vreme. Više o tome na stranici gzip, bzip2 i xz.

Pregled pre raspakivanja

Ovo radi uvek, sa svakom nepoznatom arhivom.

$ tar -tf paket.tar.gz | head
paket-1.2/
paket-1.2/README
paket-1.2/src/main.c

Uredna arhiva — sve je u jednom direktorijumu. A ova nije:

$ tar -tf lose.tar.gz | head
README
Makefile
config.h

Ovakva bi prosula fajlove u tekući direktorijum i prepisala ono što se zatekne. Za nju napravi mesto unapred:

$ mkdir raspakovano && tar -xf lose.tar.gz -C raspakovano

Detaljan ispis, kao ls -l:

$ tar -tvf backup.tar.gz | head -3
drwxr-xr-x root/root         0 2026-08-22 09:14 etc/nginx/
-rw-r--r-- root/root      2610 2026-08-15 09:00 etc/nginx/nginx.conf
lrwxrwxrwx root/root         0 2026-08-15 09:00 etc/nginx/sites-enabled/sajt -> ../sites-available/sajt

Odavde se vidi i ono što zip ne bi sačuvao: vlasništvo i simbolički link.

Provera da li je arhiva čitava:

$ tar -tf backup.tar.gz > /dev/null && echo "arhiva je ispravna"

Raspakivanje

$ tar -xf arhiva.tar.gz                 # ovde
$ tar -xf arhiva.tar.gz -C /gde/hocu/   # tamo
$ tar -xvf arhiva.tar.gz                # uz ispis fajlova

Zastavica za format pri raspakivanju nije potrebna — tar sam prepozna gzip, bzip2 ili xz. Zato je tar -xf jedini oblik koji treba pamtiti.

Samo jedan fajl

$ tar -xf backup.tar.gz etc/nginx/nginx.conf

Putanja mora biti tačno onakva kakva je u arhivi — bez početne kose crte. Ako ne znaš tačan oblik, pronađi ga:

$ tar -tf backup.tar.gz | grep nginx.conf
etc/nginx/nginx.conf

Po obrascu, uz obavezne navodnike:

$ tar -xf backup.tar.gz --wildcards "*/nginx/*"

Bez navodnika bi shell pokušao da proširi zvezdicu pre nego što tar krene — razlog je objašnjen u lekciji Džokeri i navodnici.

Skidanje nivoa direktorijuma

$ tar -tf paket.tar.gz | head -2
paket-1.2/
paket-1.2/README

$ tar -xf paket.tar.gz --strip-components=1

Sadržaj završava direktno u tekućem direktorijumu, bez omotača paket-1.2/. Standardni trik pri raspakivanju u već postojeći direktorijum.

Vraćanje sa dozvolama

$ sudo tar -xpf backup.tar.gz -C /

Opcija -p vraća originalne dozvole, a sudo je nužan da bi se vratilo i vlasništvo — običan korisnik ne sme postaviti tuđe. Bez oba, backup je vraćen samo naizgled.

Kao root je -p podrazumevano, ali ga vredi pisati eksplicitno da bude jasno šta se dešava. O dozvolama piše na stranici Pregled prava pristupa.

Izostavljanje

$ tar -czf projekat.tar.gz \
    --exclude='node_modules' \
    --exclude='*.log' \
    --exclude='.git' \
    projekat/

Dve stvari koje treba znati:

  • Navodnici su obavezni — inače shell proširi obrazac pre tar-a.
  • Redosled je bitan--exclude mora doći pre imena direktorijuma koji pakuješ. Posle njega se ignoriše.

Duži spisak ide u fajl:

$ cat izuzeci.txt
node_modules
*.log
.git
tmp/*

$ tar -czf projekat.tar.gz -X izuzeci.txt projekat/

Suprotno — pakovanje samo određenih fajlova iz spiska:

$ find /var/www -name "*.conf" > spisak.txt
$ tar -czf konfiguracije.tar.gz -T spisak.txt

Rad kroz cev

Crtica umesto imena fajla znači „standardni ulaz" ili „standardni izlaz":

$ tar -cz /home/alen | ssh server 'tar -xz -C /backup/'

Prenos bez privremene arhive na obe strane. Levo se pakuje, kroz SSH putuje, desno se raspakuje.

$ tar -czf - /var/www | gpg -c > backup.tar.gz.gpg

Enkriptovan backup, bez nešifrovane verzije na disku. O spajanju komandi ovako piše u lekciji Piping i redirekcija.

$ tar -czf - projekat/ | wc -c
48312094

Koliko bi arhiva zauzela, bez pravljenja fajla.

Dodavanje i ažuriranje

$ tar -rf arhiva.tar novi-fajl.txt      # dodaj
$ tar -uf arhiva.tar direktorijum/      # dodaj samo izmenjeno

Ovo ne radi na komprimovanoj arhivi:

$ tar -rf arhiva.tar.gz novi.txt
tar: Cannot update compressed archives

Razlog je što je kompresija primenjena na ceo tok, pa se u sredinu ne može umetati. Za izmenu moraš raspakovati, dodati i ponovo zapakovati — ili napraviti novu arhivu.

Inkrementalni backup

$ tar -czf pun-20260801.tar.gz -g snimak.snar /var/www
$ tar -czf inkr-20260808.tar.gz -g snimak.snar /var/www

Prva komanda pakuje sve i pravi fajl stanja. Druga koristi taj fajl i pakuje samo ono što se u međuvremenu promenilo.

Vraćanje ide redom, prvo pun pa svaki inkrementalni:

$ sudo tar -xpf pun-20260801.tar.gz -C /
$ sudo tar -xpf inkr-20260808.tar.gz -C /

Ako fajl .snar nestane, lanac je prekinut i sledeći inkrementalni backup više nema smisla. Čuvaj ga zajedno sa arhivama.

Za redovno pravljenje kopija je često jednostavniji rsync — on poredi izvor i odredište direktno, bez fajla stanja.

Greške koje se često prave

Zaboravljeno -f

$ tar -czvf dir/
tar: dir/: Cannot write: Broken pipe

tar je prvi argument shvatio kao ime arhive. Iza -f uvek ide ime arhive, pa tek onda ono što se pakuje.

Arhiva unutar sebe

$ cd /var/www
$ tar -czf sajt.tar.gz .
tar: ./sajt.tar.gz: file changed as we read it

Arhiva se pravi u direktorijumu koji pakuje, pa pokušava da spakuje samu sebe. Pravi je negde drugde:

$ tar -czf /tmp/sajt.tar.gz -C /var/www .

Izmena tokom pakovanja

tar: /var/lib/mysql/baza.ibd: file changed as we read it

Isti tekst, drugi uzrok: neki proces je menjao fajl dok ga je tar čitao. Takva arhiva može biti neupotrebljiva. Bazu ne pakuj direktno iz /var/lib/mysql — koristi mysqldump ili zaustavi servis.

Backup koji nikad nije proveren

$ tar -tf backup.tar.gz > /dev/null
$ echo $?
0

Ovo potvrđuje da je arhiva čitljiva, ali ne i da je vraćanje uspešno. Backup je proveren tek kad si ga jednom vratio — makar u /tmp.

Preveliki broj argumenata

$ tar -czf arhiva.tar.gz *.txt
bash: /usr/bin/tar: Argument list too long

Shell je proširio džoker u desetine hiljada imena. Rešenje je spisak fajlova:

$ find . -name "*.txt" > spisak.txt
$ tar -czf arhiva.tar.gz -T spisak.txt

Korisne sitnice

Praćenje napretka

$ tar -czf backup.tar.gz --checkpoint=1000 --checkpoint-action=dot /var/www
.....................

Ili, ako je instaliran pv:

$ tar -cz /var/www | pv | gzip > backup.tar.gz

Brže pakovanje na više jezgara

$ tar -c /var/www | xz -T0 > backup.tar.xz
$ XZ_OPT="-T0" tar -cJf backup.tar.xz /var/www

Poređenje arhive sa fajl sistemom

$ tar -df backup.tar.gz -C /
etc/nginx/nginx.conf: Mod time differs

Pokazuje šta se promenilo od trenutka pravljenja arhive.

Automatsko brisanje starih arhiva

$ find /backup -name "*.tar.gz" -mtime +30 -delete

Deo koji se najčešće zaboravi u backup skriptama — bez njega se disk popuni za nekoliko meseci. Zakazivanje kroz cron.

Kratka referenca

  • tar -czf ime.tar.gz dir/ — napravi (gzip)
  • tar -cJf ime.tar.xz dir/ — napravi (xz, manje)
  • tar -tf ime.tar.gz — pogledaj sadržaj · -tvf detaljno
  • tar -xf ime.tar.gz — raspakuj (format se prepoznaje sam)
  • tar -xf ime.tar.gz -C /gde/ — raspakuj na određeno mesto
  • sudo tar -xpf ime.tar.gz -C / — vraćanje sa dozvolama i vlasništvom
  • tar -xf ime.tar.gz put/do/fajla — samo jedan fajl
  • --strip-components=1 — skini gornji nivo
  • --exclude='obrazac' — izostavi (pre imena direktorijuma!)
  • -T spisak.txt / -X izuzeci.txt — iz fajla
  • -C dir — promeni direktorijum pre rada
  • -g snimak.snar — inkrementalni backup
  • crtica umesto imena — rad kroz cev

Vežba

$ mkdir -p ~/vezba/{dokumenti,logovi}
$ echo "tekst" > ~/vezba/dokumenti/beleska.txt
$ echo "greska" > ~/vezba/logovi/app.log
$ chmod 600 ~/vezba/dokumenti/beleska.txt
$ ln -s dokumenti ~/vezba/precica
  1. Napravi arhivu direktorijuma vezba tako da u njoj na vrhu bude vezba/, a ne cela putanja od kućnog direktorijuma.
  2. Pogledaj sadržaj detaljno i proveri da li su simbolički link i dozvole 600 zabeleženi.
  3. Napravi novu arhivu koja izostavlja sve .log fajlove i proveri da ih zaista nema.
  4. Iz prve arhive izvuci samo beleska.txt, u /tmp, bez raspakivanja ostatka.
  5. Raspakuj prvu arhivu u /tmp/test tako da sadržaj završi direktno tamo, bez omotača vezba/.

Peti zadatak je opcija koja ti najčešće zatreba pri raspakivanju tuđih paketa.


Pregled cele oblasti je na stranici Arhiviranje i raspakivanje datoteka, kompresija pojedinačnih fajlova na stranici gzip, bzip2 i xz, a format koji radi i na Windowsu na stranici zip i unzip.

Cela lekcija je deo vodiča Linux osnove.

Comments

Popular posts from this blog

Početak u Linuxu — šta je i zašto se uči

Konverzija tipova podataka u Pythonu

groupadd