Linux komanda `find` je izuzetno koristan alat koji omogućava administratorima sistema da lociraju i upravljaju datotekama i direktorijumima na osnovu različitih kriterijuma pretrage. Može da identifikuje direktorijume i datoteke prema njihovom nazivu, vrsti ili ekstenziji, veličini, dozvolama i drugim parametrima.
Pored samog pronalaženja datoteka i direktorijuma, kombinovanjem komande `find` sa drugim komandama, omogućeno je preduzimanje akcija nad rezultatima. Dodavanjem opcije `-exec`, administratori sistema mogu pokretati spoljne komande i izvršavati radnje poput kopiranja, premeštanja, brisanja ili promene dozvola za datoteke koje odgovaraju definisanim kriterijumima, kao što su veličina, ime i slično.
U ovom tekstu, prvo ćemo objasniti osnovne primere upotrebe Linux komande `find`, koji će vam pokazati kako da pronađete datoteke i direktorijume. Zatim ćemo demonstrirati kako koristiti opciju `-exec` za primenu različitih akcija na datoteke ili direktorijume na osnovu njihovih karakteristika kao što su veličina ili dozvole.
Opšta sintaksa za komandu `find` izgleda ovako:
find {putanja} {ime-datoteke-ili-direktorijuma} {akcija-koju-treba-izvršiti}
Gde:
- `putanja` specificira direktorijum u kojem se vrši pretraga.
- `ime-datoteke-ili-direktorijuma` je naziv datoteke ili direktorijuma koji se traži.
- `akcija-koju-treba-izvršiti` je radnja koja se primenjuje na pronađene stavke, na primer kopiranje, brisanje ili premeštanje.
U ovom vodiču ćemo detaljno objasniti kako pronaći datoteke i direktorijume koji odgovaraju navedenim uzorcima. Takođe ćemo istražiti kako izvršiti različite radnje nad datotekama ili direktorijumima koje komanda `find` pronađe. Ovaj vodič je baziran na Ubuntu sistemu, ali je primenjiv na većinu Linux distribucija i verzija.
Pronalaženje datoteka i direktorijuma
Pronalaženje specifičnih datoteka po imenu ili ekstenziji
Da biste pronašli određenu datoteku, izvršite sledeću komandu iz root direktorijuma (`/`). Komanda specificira tačno ime datoteke koju tražite.
find . -name file22.txt
Izlaz:
./test/file22.txt ./sales/file22.txt
Napominjemo da rezultati uključuju putanju. Ovo je posebno korisno ako ne znate tačnu lokaciju datoteke ili kada se datoteka nalazi na više mesta.
Takođe, možete tražiti datoteku u drugom direktorijumu dok ste i dalje u trenutnoj lokaciji. U tom slučaju, potrebno je da specificirate putanju do direktorijuma u kom želite da pretražujete.
find ./test -name file22.txt
Pretraga specifičnih datoteka u drugom direktorijumu
U ovom primeru, tražićemo sve datoteke koje počinju određenim slovima u direktorijumu za testiranje.
find ./test -name file*
Izlaz:
./test/file22.txt ./test/file30.doc ./test/file1.txt ./test/file5,doc
Pretraga datoteka po ekstenzijama
Da biste pronašli datoteku u Linuxu sa određenom ekstenzijom, dodajte je u komandu.
find . -name *.txt
Izlaz:
./test/subtest/subfil.txt ./test/file22.txt ./test/file1.txt ./home1/files32.txt ./home2/file22.txt ./qa/tags.txt
Pronalaženje datoteka i direktorijuma po imenu
Koristite sledeću komandu da potražite datoteke i direktorijume koji počinju slovima `ka`. Na našem računaru imamo datoteke `katree.txt` i `ka.txt`, kao i direktorijum pod nazivom `ka`.
Ako pokrenemo komandu:
find ./ -name "qa*"
Dobićemo sledeći izlaz:
./test/qatree.pdf ./test/qa.txt ./home/qa
Komanda vraća i datoteke i direktorijume koji odgovaraju kriterijumima pretrage. Da biste pronašli samo datoteke ili samo direktorijume, potrebno je da to specificirate u komandi.
Pronalaženje samo datoteka ili direktorijuma
Za pretragu samo datoteka, koristite opciju `-type f`.
Samo datoteke:
find ./ -type f -name "qa*"
Izlaz:
./test/qatree.pdf ./test/qa.txt
Samo direktorijumi:
Dodajte opciju `-type d` da biste locirali samo direktorijume.
find ./ -type d -name "qa*"
Izlaz:
./home/qa
Komanda `find` ne razlikuje velika i mala slova
Sve pretrage sa opcijom `-name` su osetljive na velika i mala slova i neće davati rezultate ako se ne poklapa velika i mala slova. Da biste dobili sve slučajeve, koristite opciju `-iname`.
find ./ -iname "qa*"
Izlaz:
./test/qatree.pdf ./test/qa.txt ./test/QAtest.txt ./home/qa
Pretraga datoteka iz više direktorijuma
Da biste pronašli datoteke u različitim direktorijumima, dodajte njihove putanje u komandu. U ovom slučaju ćemo pretraživati u `test` i `numeric` direktorijumima.
find ./test ./numeric -name file22.txt -type f
Izlaz:
./test/file22.txt /root/numeric/file22.txt
Pronalaženje više datoteka sa različitim ekstenzijama iz svih direktorijuma
Možete koristiti komandu `find` da locirate više datoteka koje dele različite ekstenzije kao što su `*.doc`, `*.txt`, `*.pdf`, itd. Ovo se može uraditi pojedinačno, jedna po jedna ekstenzija, ili korišćenjem samo jedne komande koja uključuje sve željene ekstenzije.
find . -type f ( -name "*.txt" -o -name "*.pdf" -o -name "*.doc" )
Izlaz:
./test/subtest/subfil.txt ./test/qatree.pdf ./test/file22.txt ./test/qa.txt ./test/file30.doc ./books/acro.pdf ./data1/FILE22.txt ./docs/files32.txt
Pronalaženje datoteka koje sadrže određeni tekst
Ponekad je potrebno da pristupite datoteci koja sadrži određeni tekst, ali ne možete da se setite njenog naziva ili lokacije. Ova komanda omogućava da pronađete sve datoteke koje sadrže vaš ciljni tekst.
Da biste potražili sve datoteke koje sadrže reč „hyperconvergence“, koristite:
find / -type f -exec grep -l -i "hyperconvergence" {} ;
Izlaz:
/root/numeric/hci /root/HCIP
Opcija `-i` omogućava komandi da ignoriše velika i mala slova i pronalazi tekst bez obzira da li je napisan velikim ili malim slovima, npr. hyperconvergence, Hyperconvergence, itd.
Da biste tražili datoteke u određenom direktorijumu, jednostavno ih dodajte u komandu:
find ./numeric -type f -exec grep -l -i "hyperconvergence" {} ;
Izlaz:
./numeric/hci
Istražite više primera komandi `grep`.
Pronalaženje datoteka i direktorijuma na osnovu veličine
Možete pronaći sve datoteke ili direktorijume koji su manji, jednaki ili veći od određene veličine, unutar određenog opsega, ili one koji su prazni. Koristite odgovarajući format veličine u zavisnosti od tipa datoteka ili direktorijuma koje tražite.
Opcije za veličinu uključuju:
c – bajtovi
k – kilobajti
M – megabajti
G – gigabajti
Pronalaženje datoteka određene veličine – jednake 30 MB
Za pretragu svih datoteka veličine 30 MB:
find / -size 30M
Pronalaženje datoteka većih od određene veličine
find -size +2M
Izlaz:
./Downloads/ubuntu18043.iso ./.cache/pip/http/6/e/3/8/3/6e38383f41850c3e5705d48116bc52f81b92a80500f4143050577a9c
Pronalaženje datoteka manjih od 10 MB u trenutnom direktorijumu
find . -type f -size -10M
Pronalaženje datoteka veličine između 100-200 MB
Kada tražite datoteke unutar određenog opsega, na primer između 100 i 200 MB:
find / -size +100M -size -200M
Pretraga direktorijuma većih od 20 KB
find / -type d -size +20k
Pronalaženje praznih datoteka i direktorijuma
Datoteke:
find ./ -type f -size 0
ili
find ./ -type f --empty
Direktorijumi:
find ./ -type d --empty
Pronalaženje datoteka prema starosti ili vremenu izmene
Pronalaženje datoteka starijih od n dana:
find /path/ -type f -name '*.txt' -mtime +8
`-mtime +8` će tražiti tekstualne datoteke koje su starije od 8 dana.
Prema datumu izmene
Ovo će tražiti datoteke koje su izmenjene u poslednjih 17 sati:
find . -mtime -17 -type f
Traži direktorijume koji su izmenjeni u poslednjih 10 dana:
find . -mtime -10 -type d
Pronalaženje datoteka na osnovu pristupa ili modifikacije
Pronalaženje datoteka na osnovu datuma ili vremena pristupa. Ovo vam omogućava da vidite datoteke kojima se pristupalo ili kojima se nije pristupalo u određenom periodu.
Da biste videli datoteke kojima nije pristupljeno u poslednjih 10 dana u home direktorijumu:
find /home -atime +10
Datotekama je pristupljeno pre tačno 10 dana:
find /home -atime 10
Pristupljeno u poslednjih 10 dana:
find /home -atime -10
Pronalaženje datoteka izmenjenih u poslednjih n dana
Takođe možete potražiti datoteke u `/home` direktorijumu izmenjene u poslednjih 10 dana koristeći sledeću komandu:
find /home -mtime -10
Pronalaženje datoteka izmenjenih u određenom periodu
Na primer, sve datoteke izmenjene između 6 i 15 dana u home direktorijumu:
find /home -type f -mtime +6 -mtime -15
Datoteke i direktorijumi kojima je pristupljeno u poslednjih 10 minuta
Da biste pronašli datoteke kojima je pristupljeno u poslednjih 10 minuta, koristite opciju `-amin`.
find . -amin -10 -type f
Izlaz:
./.bash_history ./[email protected]:~#
Direktorijumima je pristupljeno u poslednjih 10 minuta:
find . -amin -10 -type d
Pronalaženje datoteka koje odgovaraju određenim dozvolama
Sintaksa:
find -perm mode
Gde je `mode` dozvola koja je ili numerička, kao što su 644, 655, 700, 777, itd., ili slovna, kao što su `u=x`, `a=r+x`, itd.
Dozvolu možete specificirati na sledeća tri različita načina:
Pronalaženje datoteka sa dozvolom 777
find -perm 777
Izlaz:
./file1
Pronalaženje datoteka sa najmanje 766:find -perm -766
Izlaz:
./file2 ./file1
Komanda traži sve datoteke u kojima:
- Vlasnik datoteke ima dozvole za čitanje/pisanje/izvršavanje.
- Grupa ima dozvole za čitanje/pisanje.
- Drugi imaju dozvolu za čitanje/pisanje.
Kao takva, vraća dve datoteke koje ispunjavaju ovaj kriterijum – `file1` i `file2`. Datoteke ne moraju imati tačne dozvole od 766 i mogu imati dodatne dozvole dokle god imaju najmanje navedene.
Pronalaženje datoteka u koje vlasnik može da piše
Sada ćemo koristiti `/` da tražimo datoteke u koje može pisati bilo njihov vlasnik, grupa ili drugi.
find -perm /222
Izlaz:
. ./file2 ./file3 ./file1
Gore navedeno traži datoteke u koje može pisati bilo njihov vlasnik ili grupa.
Ovo vraća datoteke u koje se može pisati bilo ko od njih, ali ne nužno i oba. Da biste videli datoteke gde obe strane imaju dozvole za pisanje, koristite prefiks `-`.
find -perm -220
Izlaz:
./file2 ./file1
Pronalaženje datoteka u vlasništvu korisnika
Pronalaženje svih datoteka u vlasništvu Jack-a:
find /home -user jack
Izlaz:
/home/jack /home/jack/examples.desktop /home/jack/.gnupg /home/jack/.gnupg/private-keys-v1.d /home/jack/ans.cgi
Pronalaženje određenih datoteka u vlasništvu korisnika
Pronalaženje svih tekstualnih datoteka u vlasništvu Jack-a:
find /home -user jack -iname "*.txt"
Izlaz:
/home/jack/docs/file32.txt
Pronalaženje i prikaz datoteka i direktorijuma zajedno sa njihovim dozvolama
find -name "*.conf" | ls -l
Izlaz:
total 120 drwxr-xr-x 2 root root 4096 Dec 31 13:19 backup2 drwxr-xr-x 2 root root 4096 Jan 4 11:57 Desktop drwxr-xr-x 2 root root 4096 Dec 31 11:50 Documents drwxr-xr-x 2 root root 4096 Dec 31 12:27 Downloads -rw-r--r-- 1 root root 0 Jan 4 12:02 file22.doc drwxr-xr-x 2 root root 4096 Jan 4 12:14 file23 -rw-r--r-- 1 root root 0 Jan 4 12:23 file23.txt
Pronalaženje i delovanje na osnovu rezultata
U ovom odeljku ćemo pogledati kako možete delovati na datoteke koje odgovaraju obrascu navedenom u komandi `find`.
Pronalaženje datoteka i promena dozvola
Pronalaženje i promena dozvola određenih tipova datoteka. U ovom primeru ćemo raditi sa PHP datotekama sa različitim dozvolama, kao što je prikazano u nastavku.
[email protected]:~/ver$ ls -la total 8 drwxrwxr-x 2 jack jack 4096 Jan 3 14:11 . drwxr-xr-x 8 jack jack 4096 Jan 3 14:05 .. -rwxr-xr-x 1 jack jack 0 Jan 3 14:06 ans.php -rw-rw-r-- 1 jack jack 0 Jan 3 14:11 base.php -rwxr-xr-x 1 jack jack 0 Jan 3 14:06 query.php -rw-rw-r-- 1 jack jack 0 Jan 3 14:11 qust.php -rwxr-xr-x 1 jack jack 0 Jan 3 14:06 text.php -rw-rw-r-- 1 jack jack 0 Jan 3 14:11 vary.php
Sada ćemo potražiti sve PHP datoteke (gore) i zameniti njihove dozvole sa 755:
find ver -name "*.php" -type f -exec chmod 755 {} ;
Komanda traži PHP datoteke u direktorijumu `ver`, a zatim postavlja njihove dozvole na 755 (rwxr-xr-x).
Rezultati:
[email protected]:~/ver$ ls -la total 8 drwxrwxr-x 2 jack jack 4096 Jan 3 14:11 . drwxr-xr-x 8 jack jack 4096 Jan 3 14:05 .. -rwxr-xr-x 1 jack jack 0 Jan 3 14:06 ans.php -rwxr-xr-x 1 jack jack 0 Jan 3 14:11 base.php -rwxr-xr-x 1 jack jack 0 Jan 3 14:06 query.php -rwxr-xr-x 1 jack jack 0 Jan 3 14:11 qust.php -rwxr-xr-x 1 jack jack 0 Jan 3 14:06 text.php -rwxr-xr-x 1 jack jack 0 Jan 3 14:11 vary.php
Pronalaženje i promena dozvola za datoteke i direktorijume
Pronalaženje datoteka sa 644 dozvole i njihova promena tako da imaju 655 dozvola:
find . -type f -perm 644 -exec chmod 655 {} ;
Takođe možete potražiti direktorijume sa 644 dozvolama i zameniti ih sa 755.
find . -type d -perm 644
Izlaz:
./docs
Direktorijum dokumenata ima 644 dozvole:
drwxrwxr-x 2 jack jack 4096 Jan 3 12:45 docs
Da bismo ih postavili na 755, pokrećemo:
find . -type d -perm 644 -exec chmod 755 {} ;
Sada možemo ponovo da proverimo da li su dozvole 755:
find . -type d -perm 755
Izlaz:
. ./docs
Odozgo možemo videti da direktorijumi root i docs imaju 755 dozvola.
Komanda `ls -la` daje sledeće detalje:
drwxr-xr-x 2 jack jack 4096 Jan 3 12:45 docs
Pronalaženje i kopiranje datoteka ili direktorijuma
Pronalaženje i kopiranje određene datoteke u direktorijum.
Komanda ispod će pronaći datoteku `file22.txt` i kopirati je u direktorijum `~/tmp/images`.
find -iname file22.txt -exec cp {} ~/tmp/images ;
Pronalaženje i kopiranje jedne vrste datoteka u direktorijum.
Da biste pronašli datoteke kao što su slike sa ekstenzijom `jpg` u trenutnom direktorijumu i kopirali ih na drugu lokaciju kao što je folder sa slikama, koristite:
find -iname '*.jpg' -exec cp {} ~/tmp/images ;
Ovo će pronaći i kopirati sve `jpg` datoteke u folder `~/tmp/images`.
Pronalaženje i kopiranje jedne datoteke u više direktorijuma
Pronalaženje i kopiranje jedne datoteke u više direktorijuma.
find ~/tmp/dir1/ ~/tmp/dir2/ $HOME/3/ -maxdepth 0 -exec cp ~/numeric/hci {} ;
Ovo će pronaći datoteku `hci` i kopirati je u tri direktorijuma: `/tmp/dir1/`, `/tmp/dir2/` i `$HOME/3/`.
Pronalaženje i premeštanje datoteka u drugi direktorijum
Da biste premestili poznatu datoteku iz direktorijuma u drugi. Da biste premestili datoteku `universal.php`:
find ~/folder/ -type f -name universal.php -exec mv {} ~/numeric/ ;
Pretraživanje i premeštanje datoteka sa određenom ekstenzijom u drugi folder:
find ~/numeric/ -type f -name '*.php' -exec mv {} ~/folder/ ;
Pronalaženje određenih datoteka i njihovo premeštanje u određeni folder
find -type f -name uni*.* -exec mv {} ~/unifiles/ ;
Komanda traži sve datoteke čiji nazivi počinju sa `uni` i imaju bilo koju ekstenziju. Zatim ih premešta u direktorijum `/unifiles/`.
Pronalaženje i premeštanje datoteka na osnovu starosti
Pronalaženje i premeštanje datoteka starijih od navedenih dana na drugu lokaciju, kao što je arhiva.
find /path/ -type f -name '*.pdf' -mtime +20 -exec mv {} /backup1/ ;
Ovo će tražiti PDF datoteke starije od 20 dana i premestiti ih u direktorijum `backup1`.
Pronalaženje i brisanje datoteka i direktorijuma
Sintaksa za pronalaženje i uklanjanje datoteka ili direktorijuma u trenutnom direktorijumu je:
find . -type f -name "datoteka-za-brisanje" -exec rm -f {} ;
za brisanje samo datoteka ili
find . -type d -name "dir-za-brisanje" -exec rm -rf {} ;
za brisanje samo direktorijuma
Pronalaženje i brisanje samo određenih datoteka
Da biste pronašli i izbrisali datoteke koje počinju sa `til`, koristite:
find . -type f -name "til*" -exec rm {} ;
Da biste pronašli i izbrisali direktorijume koji počinju sa `til`:
find . -type d -name "til*" -exec rm {} ;
Uklanjanje i datoteka i direktorijuma
find . -name "til*" -exec rm -rf {} ;
Ovo će ukloniti i datoteke i direktorijume koji počinju slovima `til`.
Brisanje po ekstenziji
Ispod je prikazano kako možete pronaći i izbrisati sve tekstualne datoteke u trenutnom direktorijumu. Zamenite `txt` drugom ekstenzijom, kao što su `bak`, `pdf` ili bilo koja druga koju želite da uklonite.
find . -type f -name "*.txt" -exec rm -f {} ;
U slučaju da želite da vas sistem pita za potvrdu pre brisanja svake datoteke, dodajte opciju `-i` kao što je prikazano u nastavku:
find . -type f -name "*.txt" -exec rm -i {} ;
Izlaz:
rm: remove regular empty file './File22.txt'? y rm: remove regular empty file './file22.txt'? y rm: remove regular empty file './file23.txt'?
Po default-u, `rm` neće ukloniti direktorijume i potrebno je da koristite opciju `-r` da biste omogućili rekurzivno uklanjanje. Ovo osigurava brisanje praznih direktorijuma i onih koji sadrže datoteke. Opcija `-f` forsira uklanjanje i koristi se i za datoteke i za direktorijume.
Pronalaženje i brisanje datoteka starijih od n dana
Pronalaženje i brisanje rezervnih kopija datoteka starijih od 20 dana iz trenutnog direktorijuma.
find . -type f -name '*.bak' -mtime +20 -exec rm {} ;
Ovo će izbrisati sve `.bak` datoteke starije od 20 dana.
Pronalaženje i brisanje samo direktorijuma
Da biste izbrisali direktorijum pod nazivom `dir22`:
find . -type d -name dir22 -exec rm -rf {} ;
Uverite se da se poklapa velika i mala slova imena direktorijuma ili koristite opciju `-iname`.
find . -type d -iname Dir22 -exec rm -rf {} ;
Uklanja i `Dir22` i `dir22`.
Da biste potvrdili pre brisanja, koristite opciju `-i`.
find . -type d -iname Dir22 -exec rm -rf -i {} ;
Izlaz:
rm: remove directory './Dir22'? n rm: remove directory './dir22'? y
U ovom slučaju, ukucali smo `n` za direktorijum `Dir22` koji neće biti obrisan i `y` za `dir22` koji će sada biti uklonjen.
Pronalaženje i uklanjanje praznih datoteka
Možete koristiti bilo koju od sledećih komandi da biste locirali prazne datoteke i automatski ih izbrisali.
find ./ -type f -size 0 -exec rm -f {} ;
ilifind ./ -type f -size 0 | xargs rm -f
ilifind ./ -type f -size 0 --delete
Pronalaženje i uklanjanje praznih direktorijuma
Da bismo uklonili prazne direktorijume, koristićemo opciju `d`.
find ./ -type d -empty -exec rmdir {} ;
Druga alternativa je da koristite opciju `delete` umesto `remove`.
find ./ -type d -empty -delete
Imajte na umu da brisanje sistemskih ili kritičnih datoteka sa vašeg računara može oštetiti operativni sistem ili aplikacije, ili dovesti do gubitka važnih podataka.
Da biste izbegli slučajno brisanje, najbolje je da koristite korisnički nalog koji nije root. Takođe, uverite se da brišete prave datoteke koje nisu korisne i da imate rezervnu kopiju svih datoteka sa podacima za svaki slučaj.
Šta je sledeće?
Slobodno isprobajte gore navedene Linux komande za pronalaženje u vašoj laboratoriji ili neprodukcionom okruženju. Pogledajte da li možete da koristite neke od njih za automatizaciju čišćenja sistema datoteka pomoću `crontab`. A da biste savladali Linux, pogledajte ovaj online kurs.