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:
| Kolona | Značenje |
|---|---|
drwxr-xr-x | tip i dozvole |
4 | broj hard linkova |
alen alen | vlasnik i grupa |
4.0K | veličina |
Aug 21 14:32 | vreme 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:
- Napravi strukturu
projekat/{src,docs,backup}jednom komandom - Napravi tri fajla u
srci upiši nešto u svaki - Iskopiraj sve iz
srcubackup, uz čuvanje vremena izmene - Preimenuj jedan fajl i premesti ga u
docs - Izlistaj sve fajlove sortirane po vremenu, najnoviji na vrhu
- Proveri koliko ceo
projekatzauzima - Pronađi sve fajlove izmenjene u poslednjih sat vremena
- Obriši
backup— ali prvo izlistaj šta je u njemu
Comments
Post a Comment