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 —
--excludemora 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 ·-tvfdetaljnotar -xf ime.tar.gz— raspakuj (format se prepoznaje sam)tar -xf ime.tar.gz -C /gde/— raspakuj na određeno mestosudo tar -xpf ime.tar.gz -C /— vraćanje sa dozvolama i vlasništvomtar -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
- Napravi arhivu direktorijuma
vezbatako da u njoj na vrhu budevezba/, a ne cela putanja od kućnog direktorijuma. - Pogledaj sadržaj detaljno i proveri da li su simbolički link i dozvole
600zabeleženi. - Napravi novu arhivu koja izostavlja sve
.logfajlove i proveri da ih zaista nema. - Iz prve arhive izvuci samo
beleska.txt, u/tmp, bez raspakivanja ostatka. - Raspakuj prvu arhivu u
/tmp/testtako da sadržaj završi direktno tamo, bez omotačavezba/.
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
Post a Comment