Rad sa fajlovima i direktorijumima

Ovo je lekcija u kojoj terminal počinje da bude koristan. Osam komandi pokriva praktično sve svakodnevno baratanje fajlovima — kretanje, kreiranje, kopiranje, premeštanje i brisanje.

Pretpostavlja se da već znaš kako se komanda sastavlja i kako izgleda stablo direktorijuma.

Sve što sledi radi u tvojoj virtuelnoj mašini, u home direktorijumu, bez sudo. Napravi radni prostor:

$ mkdir ~/vezba
$ cd ~/vezba

Gde sam — pwd

$ pwd
/home/alen/vezba

Ispisuje punu putanju direktorijuma u kom se nalaziš. Prompt to obično već pokazuje, ali skraćeno — pwd daje ceo put.

Šta je ovde — ls

$ ls
Documents  Downloads  skripta.sh

Sam po sebi daje samo imena. Prava vrednost je u opcijama:

$ ls -l          detaljan prikaz
$ ls -a          i skriveni fajlovi
$ ls -h          čitljive veličine (uz -l)
$ ls -t          sortirano po vremenu izmene
$ ls -S          sortirano po veličini
$ ls -r          obrnut redosled
$ ls -R          i sadržaj poddirektorijuma

U praksi se spajaju:

$ ls -lah
total 24K
drwxr-xr-x.  4 alen alen 4.0K Aug 21 14:32 .
drwx------. 18 alen alen 4.0K Aug 21 14:30 ..
-rw-r--r--.  1 alen alen  1.2K Aug 21 14:31 beleske.txt
drwxr-xr-x.  2 alen alen 4.0K Aug 21 14:32 Documents

Šta znači koja kolona:

KolonaZnačenje
drwxr-xr-xtip i dozvole
4broj hard linkova
alen alenvlasnik i grupa
4.0Kveličina
Aug 21 14:32vreme poslednje izmene

Prvi znak je tip: - običan fajl, d direktorijum, l simbolički link.

Dve najkorisnije kombinacije:

$ ls -lt         najskorije izmenjeno na vrhu
$ ls -lSh        najveći fajlovi na vrhu

Prva je odlična kad tražiš šta se skoro menjalo na serveru, druga kad tražiš šta ti puni disk. Detaljno u lekciji ls.

Kretanje — cd

$ cd /var/log        apsolutna putanja
$ cd Documents       relativna, od trenutnog mesta
$ cd ..              jedan nivo gore
$ cd ../..           dva nivoa gore
$ cd ~               u svoj home
$ cd                 isto to, bez ičega
$ cd -               nazad u prethodni direktorijum

Uz cd obavezno koristi Tab. Otkucaš prvih par slova, dopuni se ostatak — brže je i ujedno proverava da li putanja uopšte postoji.

Kreiranje

Direktorijum — mkdir

$ mkdir projekat
$ mkdir dir1 dir2 dir3

Ako roditeljski direktorijum ne postoji, dobićeš grešku. Opcija -p pravi ceo niz odjednom:

$ mkdir projekat/src/utils
mkdir: cannot create directory 'projekat/src/utils': No such file or directory

$ mkdir -p projekat/src/utils

-p ujedno ne prijavljuje grešku ako direktorijum već postoji, pa je zato standardan izbor u skriptama.

Cela struktura jednim potezom:

$ mkdir -p projekat/{src,docs,tests}
$ ls projekat
docs  src  tests

Prazan fajl — touch

$ touch beleske.txt
$ touch fajl1.txt fajl2.txt fajl3.txt

Ako fajl postoji, touch mu samo ažurira vreme izmene na sadašnje. To je i njegova prvobitna namena.

Fajl sa sadržajem

$ echo "prva linija" > beleske.txt
$ echo "druga linija" >> beleske.txt

Jedna strelica prepisuje, dve dodaju na kraj. Razlika je važna — > briše postojeći sadržaj bez pitanja. Detaljno u lekciji Piping i redirekcija.

Čitanje sadržaja

$ cat beleske.txt         ceo fajl odjednom
$ less beleske.txt        stranicu po stranicu, sa pretragom
$ head beleske.txt        prvih 10 redova
$ tail beleske.txt        poslednjih 10 redova
$ tail -n 50 fajl.log     poslednjih 50 redova

Za bilo šta duže od jednog ekrana koristi less. Izlazi se sa q, traži se sa /.

Kopiranje — cp

$ cp izvor odrediste
$ cp beleske.txt kopija.txt
$ cp beleske.txt Documents/
$ cp fajl1.txt fajl2.txt Documents/

Za direktorijume je obavezna opcija -r:

$ cp projekat backup
cp: -r not specified; omitting directory 'projekat'

$ cp -r projekat backup

Opcije koje vredi znati

$ cp -i izvor odrediste      pita pre prepisivanja
$ cp -v izvor odrediste      ispisuje šta radi
$ cp -p izvor odrediste      čuva dozvole i vremena
$ cp -a izvor odrediste      arhivski režim: -r plus sve osobine
$ cp -u izvor odrediste      kopira samo ako je izvor noviji

Kad praviš rezervnu kopiju konfiguracije, koristi -a — inače gubiš dozvole i vlasništvo, što ume da slomi servis kad fajl vratiš.

Navika koja se isplati: pre svake izmene konfiguracije, napravi kopiju sa datumom.

# cp -a /etc/ssh/sshd_config /etc/ssh/sshd_config.$(date +%F)

Premeštanje i preimenovanje — mv

Jedna komanda radi oboje, jer je to za sistem ista operacija:

$ mv staro.txt novo.txt              preimenovanje
$ mv beleske.txt Documents/          premeštanje
$ mv fajl.txt Documents/novo.txt     oboje odjednom
$ mv projekat arhiva                 radi i za direktorijume, bez -r

mv ne traži -r, za razliku od cp.

Prepisuje bez pitanja

$ mv a.txt b.txt

Ako b.txt postoji, nestao je. Bez upozorenja i bez povratka. Koristi -i kad nisi siguran:

$ mv -i a.txt b.txt
mv: overwrite 'b.txt'?

Brisanje — rm

Ovde treba pažnja. Nema korpe za otpatke. Obrisano je obrisano.

$ rm fajl.txt
$ rm fajl1.txt fajl2.txt
$ rm -i fajl.txt          pita za potvrdu
$ rm -f fajl.txt          ne pita ništa, ne prijavljuje grešku

Prazan direktorijum briše rmdir:

$ rmdir prazan

Direktorijum sa sadržajem traži -r:

$ rm -r projekat

rm -rf

Kombinacija koju ćeš sretati stalno: rekurzivno i bez pitanja.

$ rm -rf projekat

Radi tačno ono što tražiš, a to je i problem. Nekoliko pravila koja te čuvaju:

Prvo pogledaj šta pogađaš. Ista putanja, sa ls:

$ ls *.tmp
$ rm *.tmp

Pazi na razmak koji ne treba da bude tu.

$ rm -rf /home/alen/staro     briše jedan direktorijum
$ rm -rf / home/alen/staro    počinje da briše ceo sistem

Ne kucaj završnu kosu crtu sa džokerom.

$ rm -rf ~/backup/*/

Ako se promenljiva u skripti isprazni, ovakav izraz ume da pokaže na mesto koje nisi nameravao. Zato se u skriptama koristi set -u, objašnjeno u četvrtom delu bash serije.

Na tuđem serveru prvo pwd, pa onda rm.

Šta je ovo — file

Pošto ekstenzija na Linuxu ne znači ništa, tip fajla se proverava sadržajem:

$ file beleske.txt
beleske.txt: ASCII text

$ file /usr/bin/ls
/usr/bin/ls: ELF 64-bit LSB pie executable, x86-64

$ file arhiva.tar.gz
arhiva.tar.gz: gzip compressed data

Korisno pre nego što otvoriš nepoznat fajl sa cat-om — binarni sadržaj ume da poremeti terminal. Ako se to desi, popravi ga sa reset.

Rad sa više fajlova odjednom

Džokeri iz lekcije o komandnoj liniji ovde dobijaju punu primenu:

$ cp *.txt Documents/
$ mv izvestaj-2025-*.pdf arhiva/
$ rm *.tmp
$ ls -lh *.log

Zapamti da proširivanje radi shell, ne komanda. Zato je provera sa ls uvek prvi korak.

Kopiranje na drugi računar

Iste operacije preko mreže:

$ scp fajl.txt korisnik@server:/putanja/
$ scp -r direktorijum korisnik@server:/putanja/
$ scp korisnik@server:/putanja/fajl.txt .

Za veće ili ponovljene prenose bolji je rsync, jer prenosi samo razlike:

$ rsync -av ~/projekat/ korisnik@server:/backup/projekat/

Kod rsync-a kosa crta na kraju izvora menja značenje: sa njom se kopira sadržaj direktorijuma, bez nje ceo direktorijum. Čest izvor zabune.

Koliko šta zauzima

$ du -sh Documents
1.2G  Documents

$ du -sh * | sort -h
12K   beleske.txt
340M  Downloads
1.2G  Documents

$ df -h

du meri direktorijume, df particije. Kad ti se disk puni, kreni sa df -h da vidiš koja particija, pa onda du da nađeš šta u njoj.

Pronalaženje fajla

$ find . -name "*.txt"
$ find /etc -name "*.conf"
$ find ~ -mtime -7
$ find /var/log -size +100M
$ find / -name "httpd.conf" 2>/dev/null

find pretražuje stablo u trenutku poziva, pa je spor ali tačan. locate koristi bazu i vraća rezultat odmah, ali ne vidi fajlove nastale posle poslednjeg indeksiranja.

Česte greške

„No such file or directory"

Pogrešna putanja, greška u kucanju, ili nisi tamo gde misliš. Proveri sa pwd i ls, i koristi Tab.

„Directory not empty"

rmdir briše samo prazne. Za ostalo rm -r.

„Permission denied"

Nemaš prava nad fajlom ili nad direktorijumom u kom je. Pogledaj ls -l, pa ako je opravdano — sudo.

Ime fajla sa razmakom

$ rm moj dokument.txt      briše pogrešno
$ rm "moj dokument.txt"    ispravno

Fajl koji počinje crticom

$ rm -fajl.txt
rm: invalid option -- 'f'

$ rm ./-fajl.txt

Komanda misli da je crtica opcija. Dodaj ./ ispred.

Vežba

U ~/vezba:

  1. Napravi strukturu projekat/{src,docs,backup} jednom komandom
  2. Napravi tri fajla u src i upiši nešto u svaki
  3. Iskopiraj sve iz src u backup, uz čuvanje vremena izmene
  4. Preimenuj jedan fajl i premesti ga u docs
  5. Izlistaj sve fajlove sortirane po vremenu, najnoviji na vrhu
  6. Proveri koliko ceo projekat zauzima
  7. Pronađi sve fajlove izmenjene u poslednjih sat vremena
  8. Obriši backup — ali prvo izlistaj šta je u njemu

Povezano: cp · mv · rm · mkdir · find · 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