Brisanje in preimenovanje datotek v Linuxu: rm, mv, ln

Linux Branje: 11 min

V Linuxu datoteke in mape brišeš z ukazoma rm in rmdir, preimenuješ ali premikaš z ukazom mv, z ukazom ln pa nanje narediš povezavo. Ukazi so preprosti, imajo pa nekaj pasti: brisanja ni mogoče razveljaviti, mv brez besed prepiše ciljno datoteko, pri brisanju simbolne povezave pa lahko poševnica na napačnem mestu izprazni tudi cilj povezave.

Ukaze iz članka smo novembra 2026 preizkusili v sistemih AlmaLinux 10.2 in Ubuntu 26.04. Enako delujejo na lastnem KVM VPS in v vmesniku Terminal cPanela. Kratek pregled osnovnih ukazov daje članek o osnovnih ukazih Linux.

Brisanje datoteke: rm

rm fajl.txt
rm fajl1.txt fajl2.txt
rm *.log

V Linuxu ni koša: kar izbriše rm, takoj izgine in tega iz ukazne vrstice ni mogoče obnoviti. Pred pomembnimi datotekami naredi varnostno kopijo (glej: varnostno kopiranje in obnovitev podatkov v Linuxu).

Uporabna stikala:

  • -i: pred vsako datoteko vpraša (rm: remove regular file 'fajl.txt'?), odgovor y jo izbriše, n pa obdrži;
  • -I: vpraša le enkrat, če briše več kot tri datoteke ali mapo rekurzivno (rm: remove 4 arguments?); manj vprašanj, a pri napačno vtipkanem nadomestnem znaku te še ustavi;
  • -v: izpiše, kaj je izbrisal (removed 'fajl.txt');
  • -f: ne sprašuje in ne javlja napake za neobstoječe datoteke.

Če je datoteka zaščitena pred pisanjem (na primer chmod 444), rm v terminalu vpraša: rm: remove write-protected regular empty file 'vedett.txt'?. -f utiša tudi to vprašanje. Če ukaz vhoda ne dobi iz terminala (v skripti, opravilu cron), datoteko, zaščiteno pred pisanjem, izbriše brez vprašanja.

V AlmaLinuxu je v datoteki .bashrc uporabnika root privzeto vrstica alias rm='rm -i', zato po sudo -i rm vpraša za vsako datoteko. sudo rm pa vzdevka ne uporablja in ne sprašuje; v Ubuntu 26.04 tudi root nima takega vzdevka. O ustvarjanju lastnih vzdevkov govori članek o vzdevkih bash.

Brisanje mape skupaj z vsebino: rm -r

Prazno mapo izbriše rmdir. Če je v mapi kaj, vrne napako, tudi navaden rm mape ne izbriše:

$ rmdir regi-oldal
rmdir: failed to remove 'regi-oldal': Directory not empty
$ rm regi-oldal
rm: cannot remove 'regi-oldal': Is a directory

Mapo z vso vsebino izbriše stikalo -r (rekurzivno):

rm -r regi-oldal
rm -rv regi-oldal    # izpiše, kaj je izbrisal
rm -rI regi-oldal    # pred tem enkrat vpraša

rmdir neprazne mape ne izbriše, rm -rv jo izbriše skupaj z vsebino in izpiše izbrisane datoteke

Nevarnosti rm -rf

rm -rf brez vprašanja in z utišanjem napak izbriše vse, kar dobi. Večina težav ne nastane zaradi ukaza, temveč zaradi poti, ki jo dobi:

  • Presledek v poti: rm -rf /var/www/regi oldal dobi dve poti, mapo /var/www/regi in tisto z imenom oldal v trenutnem imeniku. Ime s presledkom postavi med narekovaje: rm -rf "/var/www/regi oldal".
  • Prazna spremenljivka v skripti: če je $MAPA prazna, bi rm -rf "$MAPA"/* izbrisal vsebino korenskega imenika. V skripti uporabi obliko ${MAPA:?}, ki pri prazni spremenljivki skripto ustavi z napako (MAPA: parameter null or not set): rm -rf "${MAPA:?}"/*.
  • Relativna pot v napačnem imeniku: rm -rf * vedno briše v trenutnem imeniku. Pred tem pwd pokaže, kje si, ls pa, kaj bi se izbrisalo.

Samega korenskega imenika GNU rm privzeto noče rekurzivno izbrisati (rm: it is dangerous to operate recursively on '/'), vendar to ščiti le pot /, map pod njo pa ne.

Če nisi prepričan, mapo namesto brisanja najprej preimenuj ali premakni (na primer mv regi-oldal regi-oldal.torolni) in jo izbriši šele čez nekaj dni.

Permission denied

rm: cannot remove '/srv/vedett/x': Permission denied

Za brisanje datoteke je potrebna pravica pisanja v mapo, ki datoteko vsebuje, lastna dovoljenja datoteke pri tem niso pomembna. V tem primeru ne pomaga niti -f. Če je datoteko res treba izbrisati in gre za sistemsko datoteko ali datoteko drugega uporabnika, je potreben sudo rm. Delovanje dovoljenj pojasnjuje članek o ukazih chmod in chown.

Datoteke z nenavadnimi imeni

Ime, ki se začne z vezajem, rm razume kot stikalo:

$ rm -x.txt
rm: invalid option -- 'x'
Try 'rm ./-x.txt' to remove the file '-x.txt'.

Rešitvi sta dve: ./ pred imenom ali --, za katerim ukaz ničesar več ne šteje za stikalo:

rm ./-x.txt
rm -- -x.txt

Ime s presledkom ali posebnimi znaki postavi med narekovaje (rm "szep fajl.txt") ali uporabi tipko Tab, ki ime dopolni s potrebnimi ubežnimi znaki.

Se prostor sprosti?

Če veliko datoteko (na primer dnevnik) tekoči program še drži odprto, se prostor po izbrisu ne sprosti, dokler je program ne zapre. Takrat df še vedno kaže poln disk. Kako najdeš takšne datoteke in kako izprazniš dnevnik brez brisanja, pokaže članek Disk je poln, du pa tega ne pokaže.

Varno brisanje: shred

Vsebina izbrisane datoteke lahko ostane na disku berljiva, dokler ni prepisana. shred datoteko pred izbrisom prepiše z naključnimi podatki:

shred -u -v titkos.txt

Po dokumentaciji shred to na datotečnih sistemih z dnevnikom (journaling), SSD in navideznih računalnikih ne zagotavlja, da so prepisane vse kopije, ker lahko sistem shranjevanja podatke zapiše tudi drugam. Pri zaupnih podatkih je zato zanesljivejša rešitev šifriranje celotnega diska.

Preimenovanje in premikanje: mv

Linux nima posebnega ukaza za preimenovanje: tudi preimenovanje je naloga ukaza mv.

mv regi-nev.txt uj-nev.txt        # preimenovanje
mv fajl.txt /var/www/html/        # premik v drugo mapo
mv fajl1.txt fajl2.txt mentes/    # več datotek v eno mapo
mv regi-mappa uj-mappa            # preimenovanje mape

Tako preimenuješ tudi mapo, brez stikala -r.

mv privzeto brez besed prepiše ciljno datoteko. Če uj-nev.txt že obstaja, se njena vsebina izgubi. To preprečiš s stikali:

  • -i: vpraša za prepis (mv: overwrite 'b.txt'?);
  • -n: nikoli ne prepiše obstoječe datoteke;
  • -b: pred prepisom staro ciljno datoteko obdrži pod imenom s končnico ~ (b.txt~);
  • -v: izpiše, kaj je naredil (renamed 'a.txt' -> 'c.txt').

Če je cilj obstoječa mapa, mv vir postavi vanjo: po mv dir1 dir2 bo mapa na mestu dir2/dir1, ne pod imenom dir2. Neprazne mape ni mogoče premakniti na neprazno mapo z istim imenom (mv: cannot overwrite 'e/a': Directory not empty); za združitev vsebine dveh map sta primerna rsync ali cp -a.

Premik na drug datotečni sistem

Znotraj istega datotečnega sistema mv le spremeni ime: tudi premik mape z več gigabajti je takojšen, inode datotek pa se ne spremeni. Če je cilj na drugem disku ali particiji (na primer na ločeno priklopljenem disku ali v Ubuntuju v mapi /tmp v pomnilniku), mv vir v resnici kopira in nato izbriše:

$ mv -v /dev/shm/z.txt ~/proba/
copied '/dev/shm/z.txt' -> '/home/admin/proba/z.txt'
removed '/dev/shm/z.txt'

Pri velikih podatkih to traja dolgo, in če se vmes prekine, je lahko cilj napol dokončan. Pri velikih mapah je varneje najprej kopirati (rsync -a ali cp -a), preveriti in šele nato izbrisati vir. Podrobnosti kopiranja opisuje članek o kopiranju datotek.

Razlika med cp -a in mv

  mv (na istem datotečnem sistemu) cp -a
Ali vir ostane? ne da
Hitrost takojšnja odvisna od velikosti
Ali potrebuje prosti prostor? ne da, celotno velikost
Pravice, lastnik, datumi nespremenjeni ohrani (lastnika le kot root)
Simbolne povezave nespremenjeni kopira kot povezavo

Navaden cp (brez -a) namesto simbolne povezave kopira vsebino cilja, datum datotek pa postane čas kopiranja.

SELinux (AlmaLinux, Rocky Linux): mv s seboj prenese tudi oznako SELinux datoteke, cp pa novi datoteki da oznako ciljne mape. V preizkusu je datoteka, premaknjena iz domačega imenika v mapo spletnega strežnika, dobila oznako user_home_t in nginx je zanjo vrnil napako 403, kopirana datoteka pa je delovala. Takrat sudo restorecon -v fajl obnovi oznako; podrobno to opisuje članek o odpravljanju napak SELinux Permission denied.

Preimenovanje veliko datotek hkrati

mv naenkrat lahko preimenuje le eno datoteko. Za več datotek lahko uporabiš ukaz rename ali kratko zanko bash. Ukaz rename ima dve povsem različni različici:

AlmaLinux, Rocky Linux: rename iz util-linux

V AlmaLinuxu je rename del util-linux in je privzeto nameščen. Izvaja preprosto zamenjavo besedila: rename KAJ S_ČIM DATOTEKE.

rename -n -v .jpeg .jpg *.jpeg   # le pokaže, kaj bi se zgodilo
rename -v .jpeg .jpg *.jpeg
`kep1.jpeg' -> `kep1.jpg'
`kep2.jpeg' -> `kep2.jpg'

-n je poskusni zagon: izpiše spremembe, vendar ničesar ne preimenuje. Pri vsaki datoteki zamenja le prvo pojavitev (iz aa-aa.txt nastane ba-aa.txt); vse zamenja s stikalom -a.

Ubuntu, Debian: rename v Perlu

V Ubuntuju in Debianu je ukaz rename v paketu rename (sudo apt install rename; na cloud image Ubuntu 26.04 ni bil nameščen). Ta različica pričakuje regularni izraz Perl, zato je veliko prilagodljivejša:

# Poskusni zagon: podčrtaj namesto presledka, .jpg namesto .JPEG
rename -n 's/ /_/; s/\.JPEG$/.jpg/' *

# Izvedba
rename -v 's/ /_/; s/\.JPEG$/.jpg/' *

# Zamenjava vseh presledkov (g = global)
rename 's/ /_/g' *

# Pretvorba v male črke
rename 'y/A-Z/a-z/' *

Množično preimenovanje z ukazom rename v Perlu v Ubuntuju: poskusni zagon -n, nato izvedba -v

Če v Ubuntuju navedeš obliko util-linux (rename .jpeg .jpg *.jpeg), se različica v Perlu ustavi s sintaktično napako (syntax error at line 1) in ničesar ne preimenuje. Različica util-linux je v Ubuntuju na voljo pod imenom rename.ul. V AlmaLinux 10 različice v Perlu nismo našli ne v osnovnih repozitorijih ne v EPEL.

Zanka bash: deluje povsod

Če ne veš, kateri rename je na računalniku, zanka bash deluje v kateri koli distribuciji:

# Zamenjava končnice: .JPG -> .jpg
for f in *.JPG; do mv -v -- "$f" "${f%.JPG}.jpg"; done

# Imena datotek z malimi črkami
for f in *[A-Z]*; do mv -v -- "$f" "$(echo "$f" | tr 'A-Z' 'a-z')"; done

Zaradi narekovajev "$f" deluje tudi z imeni s presledki, -- pa ščiti imena, ki se začnejo z vezajem. Pred pravim zagonom echo pred mv pokaže, kaj bi zanka naredila.

Povezave: ln

Povezava je drugo ime, ki kaže na datoteko ali mapo. Obstajata dve vrsti.

Simbolna povezava je majhna datoteka, ki hrani pot. Lahko kaže na mapo, na datoteko na drugem datotečnem sistemu in celo na neobstoječ cilj.

ln -s CILJ IMEPOVEZAVE
ln -s /var/www/pelda.hu/public_html ~/public_html
ln -s /etc/nginx/sites-available/pelda.hu /etc/nginx/sites-enabled/

ls -l povezavo prikaže s črko l in puščico (current -> releases/2026-11-01).

Pri relativni povezavi se cilj nanaša na mesto povezave, ne na mapo, v kateri si zagnal ukaz. ln -s releases/v1 a/rossz ustvari prekinjeno povezavo, ki kaže na cilj a/releases/v1; pravilno je ln -s ../releases/v1 a/jo. ln -sr releases/v1 a/rel (relative) pravo relativno pot izračuna sam (a/rel -> ../releases/v1). Z absolutno potjo (ki se začne z /) se ta težava ne pojavi.

Preusmeritev povezave: ln -sfn

Preusmeritev obstoječe povezave na drug cilj je pogosta naloga, na primer pri nameščanju (povezava current kaže na mapo trenutne različice). Pri povezavi na mapo navaden ln -sf ne naredi tega, kar bi pričakoval: v ciljni mapi stare povezave ustvari novo povezavo, current pa ostane nespremenjena. Potrebno je stikalo -n, ki obstoječi povezavi ne sledi, temveč jo zamenja:

ln -sfn releases/2026-11-08 current

Ustvarjanje simbolne povezave, preusmeritev z ukazom ln -sfn in preverjanje cilja z ukazom readlink -f

Kam kaže povezava?

readlink current       # shranjena pot: releases/2026-11-08
readlink -f current    # celotna, razrešena pot
ls -l current

Prekinjene povezave (katerih cilj ne obstaja več) poiščeš z ukazom find:

find /var/www -xtype l

Druge možnosti iskanja predstavlja članek s primeri ukaza find.

Brisanje povezave brez brisanja cilja

Brisanje povezave ne vpliva na cilj:

rm current
unlink current

Za imenom povezave ne piši poševnice. current/ že pomeni ciljno mapo, ne povezave. rm current/ vrne napako (Is a directory), rm -r current/ pa je v preizkusu izbrisal celotno vsebino ciljne mape in pustil le samo povezavo (rm: cannot remove 'current/': Not a directory). rm -rf current/ je prav tako izpraznil ciljno mapo in zaradi -f ni izpisal niti sporočila o napaki. Tipka Tab je v preizkusu v obeh sistemih za ime povezave na mapo dodala poševnico (ls current/), zato pred brisanjem vedno preveri ukazno vrstico.

Trda povezava: ln brez stikala -s

ln brez -s naredi trdo povezavo: drugo ime iste datoteke, z istim inodom.

ln eredeti.txt masodik.txt
ls -li eredeti.txt masodik.txt

Vsebina datoteke ostane, dokler obstaja vsaj eno njeno ime: po izbrisu eredeti.txt je masodik.txt enako berljiva. Trdo povezavo je mogoče narediti le znotraj istega datotečnega sistema in ne na mapo (ln: releases: hard link not allowed for directory). V praksi je pogostejša simbolna povezava; vpliv trdih povezav na porabo diska opisuje članek o ukazu du.

Povzetek

Naloga Ukaz
Brisanje datoteke rm fajl
Brisanje prazne mape rmdir mappa
Brisanje mape z vsebino rm -r mappa
Brisanje s potrditvijo rm -ri mappa ali rm -rI mappa
Brisanje datoteke, ki se začne z vezajem rm -- -fajl
Preimenovanje mv regi uj
Preimenovanje brez prepisa mv -n regi uj
Množično preimenovanje (Ubuntu, Debian) rename 's/regi/uj/' *
Množično preimenovanje (AlmaLinux) rename regi uj *
Simbolna povezava ln -s cel link
Preusmeritev povezave ln -sfn ujcel link
Cilj povezave readlink -f link
Brisanje povezave rm link (brez poševnice)
Nazaj: Linux – članki (76)