3. Könyvtár- és fájlkezelés

Szinte minden operációs rendszer alapvető része a fájlrendszerek kezelése. Ezt a fogalmat a fájlrendszerekről szóló részben pontosítjuk, most röviden a háttértáron tárolt könyvtárak, fájlok és egyéb, azok rendszerezésre szolgáló elemek együttesét értjük. Ebben a fejezetben az ehhez kapcsolódó fogalmakat és parancsokat ismerjük meg.

3.1. A tartalomjegyzék

A Windowshoz hasonlóan a Unix esetében is a fájljaink könyvtárakban helyezkednek el. Az ok ugyanaz, mint amit valószínűleg már jól ismersz: a könyvtárak lehetővé teszik a fájlok logikus elrendezését, nem kell minden fájlt ömlesztve, egyetlen helyen tárolni. Egy másik ok a teljesítmény növelése, a kisebb fájlszámú könyvtárakban sokkal gyorsabban megtalálható egy-egy fájl. A könyvtárak tartalmát, a tartalomjegyzéket a rendszer nyilvántartja, és a felhasználó azt meg is jelenítheti az ls parancs használatával (az ls a list szó rövidítése). Az ls paraméterek nélkül az aktuális könyvtár fájljainak és könyvtárainak nevét jeleníti meg. Windows-on, amennyiben a Putty beállításakor a terminál típusának xterm-color-t adtál meg, most a tartalomjegyzék színesben jelenik meg, a könyvtárak kékkel, a fájlok zöld színnel láthatók. (Amikor először jelentkezel be, az aktuális könyvtárad az ún. home könyvtárad, ami még látszólag üres. Ezért a példa kedvéért egy másik könyvtárba lépünk a cd /etc paranccsal. Ha nem tudod, mit jelent ez, hamarosan megtanuljuk.)

feri@columbo:~$ cd /etc
feri@columbo:/etc$ ls
acpi                    init.d                   ppp
adduser.conf            initramfs-tools          profile
aliases                 inputrc                  profile.d
alternatives            insserv                  protocols
apm                     insserv.conf             python
apparmor                insserv.conf.d           python2.7
apparmor.d              iproute2                 rc0.d
apport                  iscsi                    rc1.d
apt                     issue                    rc2.d
at.deny                 issue.net                rc3.d

A tartalomjegyzéknek ez a formája nem sok információt ad, ezért a gyakorlatban nem ezt, hanem egy részletesebb megjelenítést szoktunk használni. Ehhez az ls parancsot a -l kapcsolóval egészítjük ki. A -l hatására az az egyes fájlok és könyvtárak részletes adatai is megjeleníti hosszú (long, ezért éppen l a kapcsoló) listát ad.

feri@columbo:/etc$ ls -l
összesen 900
drwxr-xr-x 3 root root    4096 febr   2 14:06 acpi
-rw-r--r-- 1 root root    2981 febr   2 13:51 adduser.conf
-rw-r--r-- 1 root root     185 febr   2 14:21 aliases
drwxr-xr-x 2 root root    4096 febr   2 14:24 alternatives
drwxr-xr-x 3 root root    4096 febr   2 14:05 apm
drwxr-xr-x 3 root root    4096 febr   2 14:06 apparmor
drwxr-xr-x 8 root root    4096 febr   2 14:06 apparmor.d
drwxr-xr-x 5 root root    4096 febr   2 14:06 apport
drwxr-xr-x 6 root root    4096 febr   2 14:22 apt
-rw-r----- 1 root daemon   144 okt   25  2011 at.deny
-rw-r--r-- 1 root root    2076 márc  28  2013 bash.bashrc
-rw-r--r-- 1 root root   58753 máj   10  2013 bash_completion
drwxr-xr-x 3 root root   12288 febr   2 14:08 bash_completion.d
-rw-r--r-- 1 root root     356 jan   28  2013 bindresvport.blacklist

Lássuk, hogy mit is jelentenek az egyes oszlopok! Most még nem derül fény mindenre, a linkek és a jogosultsági rendszer tárgyalásakor még visszatérünk néhányukra.

-rw-r--r-- 1 root root    2981 febr   2 13:51 adduser.conf
---------- - ---- ----    ---- -------------- ------------
|    |     |  |    |       |          |            |
1    2     4  5    6       7          8            9
1. Típus:A sor első karaktere a fenti pédában - vagy d, ez alapján tudható, hogy az illető sor egy fájlt vagy egy könyvtárat jelent. Később esik majd szó az ún. softlinkről, ebben az esetben az első karakter l (kis el), a blokkos eszközfájlról, amit a b karakter jelöl, és a karakteres eszközfájlról, amit c. Más típusú bejegyzések is lehetnek egy tartalomjegyzékben, de ezekkel ebben a jegyzet nem foglalkozunk, ha érdeklődsz, a named pipe-nak nézz utána.
2. Jogok:Az első karakter után álló kilenc karakter a bejegyzéshez tartozó jogosultságokat írja le. Az már most nyilvánvalónak tűnik, hogy az r valamiféle olvasást, a w pedig írást jelent, részletesen erről a jogosultsági rendszernél lesz szó.
3. Linkszám:A második oszlopban látható szám az ún. linkszám, jelentésüket a hardlinkről szóló résznél ismered majd meg.
4-5. Tulajdonos, csoport:
 A harmadik és negyedik oszlopban a bejegyzéshez tartozó tulajdonos és csoport tartozik. Szintén a jogosultsági rendszer tárgyalásakor tisztázzuk ezek jelentését.
6. Méret:A következő szám a bejegyzés mérete. Fájlok esetében könnyen értelmezhető, a fájl hosszát jelenti bájtban. A könyvtárak is helyet foglalnak a diszken, így ezeknek is van méretük, ez olvasható itt le.
7. Dátum, idő:A hatodik, hetedik, és nyolcadik oszlop egy dátumot és időt ír le, ez a fájl vagy könyvtár utolsó módosításának dátuma és ideje. A korszerű operációs rendszerek emellett minden elem esetén képesek rögzíteni az utolsó olvasás és a létrehozás dátumát és idejét is, de a gyakorlatban ezek nem annyira fontosak, mint az utolsó módosítás ideje. Ezért egyes üzemeltetők ki is kapcsolják ezek rögzítését, így felgyorsítva egy kicsit a rendszerüket.
8. Név:Végül, az utolsó oszlopban látható a fájl vagy könyvtár neve.

Note

A Unixban a rejtett fájlok neve ponttal kezdődik. A rejtettség csak annyit jelent, hogy az ls parancs csak a -a kapcsoló használata esetén jeleníti meg őket. A saját használatra kijelölt könyvtáradban lesznek ilyen fájlok, pl. a már korábban említett .bash_history is ilyen. Mivel a napi munka során ezek a fájlok listázása nem igazán fontos, ezért ezek rejtettek, alapértelmezésben az ls kimenetében nem láthatók.

3.2. Az inode

Ahhoz, hogy a Unix fájlrendszerével kapcsolatos műveleteket jól megértsd, meg kell ismerned az inode fogalmát. A fenti példák ugyanis azt sugallják, hogy az egyes fájlok és könyvtárak jellemzőit (mérete, dátumai, tulajdonos, csoportja) a tartalomjegyzék tárolja, pedig ez nem így van. A fájnév kivételével minden minden jellemző a fájlrendszer egy másik egységében, a fájlhoz tartozó ún. inode-ban van. A tartalomjegyzék csak a fájl nevét és egy, az inode-ra mutató pointert tartalmaz, ahogy az alábbi ábrán látod.

Az inode felépítése

Azt, hogy egy fájl melyik inode ír le, az ls -dil paranccsal kérdezheted le, példánkban látszik, hogy az /etc/adduser.conf fájl jellemzőit a 840-es inode tartalmazza.

root@columbo:~/demo# ls -dil /etc/adduser.conf
840 -rw-r--r-- 1 root root 3019 márc  30 08:44 /etc/adduser.conf

Ha az inode tartalmát szeretnéd látni, használd a stat parancsot!

root@columbo:/etc# stat adduser.conf
  Fájl: ”adduser.conf”
    Méret: 3019         blokkok: 8          IO-blokk: 4096   szabályos fájl
Eszköz: 801h/2049d      I-node: 840         linkek: 1
Hozzáférés: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Elérés: 2017-03-30 08:44:13.086530956 +0200
Módosítás: 2017-03-30 08:44:13.086530956 +0200
 Változás: 2017-03-30 08:44:13.086530956 +0200
 Születés: -

A fájlrendszerről részletesen az unix fájlrendszereknél fejezetben olvashatsz.

3.2.1. Helyettesítő karakterek

TODO: regulásris kifejezések A fájlrendszeren végzett munka során nagy segítséget jelent, ha több elemre együttesen is tudsz hivatkozni, pl. a törlést végző parancsot tudod úgy paraméterezni, hogy az minden tmp kiterjesztésű fájlt töröljön. Ezért van néhány speciális karakter, amely az ilyen esetekben használatos.

  • A * több karaktert helyettesít. Így a pass* minden olyan bejegyzésnek megfelel, amelynek az első 4 karaktere pass. De a * használható egy név belsejében is: a p*s*d jelentése: az első karakter p, az utolsó d, és a kettő közt valahol kell lennie egy s-nek is. Így ezzel pl. a password nevű fájlra hivatkozhatunk.
  • A ? pontosan egy karaktert helyettesít azon a helyen, ahová azt írod. A p?ss azoknak a neveknek felel meg, amelyek első karaktere p, a harmadik és negyedik pedig s.
  • A [] karakterek közt több karaktert is felsorolhatsz. Az adott pozíción egyetlen karakter szerepelhet, az, amelyet a zárójelek közé írtál. Így a p[aA]ssword két névre, a password-re és a pAssword-re illeszkedik. A zárójelpár esetén tagadást is használhatsz a zárójelbe írt ^ karakterrel. A p[^aA]ssword hatása épp az ellenkezője lesz az előzőnek, a második pozíción a a és a A kivételével bármilyen karakter szerepelhet.

Az ls d*.conf csak a conf kiterjesztésű fájlokat listázza:

feri@columbo:/etc$ ls -l d*.conf
-rw-r--r-- 1 root root 2969 márc  15  2012 debconf.conf
-rw-r--r-- 1 root root  604 okt   20  2011 deluser.conf

Az alábbi példa értelmezését rád bízom:

feri@columbo:/etc$ ls -l p[aA][^d]sw*[rRxX]*
-rw-r--r-- 1 root root 15905 márc  28  2014 passwd.org

Tip

A helyettesítő karktereket nem az egyes parancsok értelmezik, hanem a parancsértelmező. A ls -l d*.conf parancs végrhajtásakor a shell elvégzi a d*.conf kifejtését, azaz megkeresi az aktuális könyvtárban az ennek megfelelő bejegyzéseket (könyvtárakat, fájlokat). Az eredeti kifejezést ezután az így kapott listára cseréli. A fenti példa alapján az ls -l d*.conf parancs kiadásakor valójában az ls -l debconf.conf deluser.conf fut le. Ez a működés azért előnyös, mert így nem kellett az egyes parancsokba kódolni a speciális karakterek jelentését.

3.3. Könyvtárkezelő parancsok

A könyvtárak kezelésére további parancsok szolgálnak, nézzük át ezeket!

3.3.1. ls

Bár már láttad, hogy az ls a tartalomjegyzék megtekintésére szolgál, nézzük meg néhány hasznos paraméterét!

A -d vagy a -ld kapcsolókkal használva azt írjuk elő, hogy a parancs a könyvtárak adatait jelenítse meg, ne azok tartalmát. Az alábbi példa megvilágítja ezt, az első esteben a tesztDir tartalmát, a második esetben, a -d kapcsolóval már magát a tesztDir könyvtárbejegyzés adatait kérdezem le.

root@columbo:~/demo# ls -l tesztDir/
-rw-r--r-- 1 kiraly.roland users 0 júl    8 22:46 adatok.txt

root@columbo:~/demo# ls -ld tesztDir/
drwxr-xr-x 2 kiraly.roland users 4096 júl    8 22:46 tesztDir/

3.3.2. pwd

A pwd (Print Working Directory) az aktuális könyvtár pontos elhelyezkedését írja ki. Az aktuális könyvtár (vagy munkakönyvtár) az, amelyikben éppen dolgozol, amit az általad kiadott parancsok is használnak. A pwd parancsot nem sokszor használjuk, mert a prompt amúgy is mutatja, melyik az, de később, pl. a shell scriptek írásakor még szükség lesz rá, így érdemes megjegyezned a használatát.

feri@columbo:/etc$ pwd
/etc

A példában az etc a könyvtár neve, az előtte levő / karakter pedig a gyökérkönyvtárat jelenti. Az aktuális könyvtár tehát a gyökérkönyvtárból nyíló etc könyvtár. Ha eddig Windows-zal dolgoztál, könnyű összetéveszteni a karakterrel, ott az jelöli a gyökérkönyvtárat. Több könyvtár esetén az egyes könyvtárakat elválasztó karakter is a / lesz, ahogyan az alábbi példában láthatod.

feri@columbo:/var/log$ pwd
/var/log

A Unixok minden felhasználó számára biztosítanak egy könyvtárat, amit a felhasználó teljes egészében a saját céljaira használhat fel. Ezt nevezik a felhasználó home könyvtárának. Erre a könyvtárra a ~ karakterrel lehet hivatkozni, a későbbiekben bizonyos feladatokat ennek használatával elegánsan meg tudunk oldani. Az alábbi példában a prompt a ~ karaktert tartalmazza, a pwd viszont már a könyvtár pontos helyét adja vissza, ami a /home/feri.

feri@columbo:~$ pwd
/home/feri

Note

  • A home könyvtár rendszerint a /home nevű könyvtárból nyílik. A gyakorlatban ez néha félreértést okoz, ez csak egy kiinduló pont, nem ezt nevezzük a felhasználó home könyvtárának.

3.3.3. cd

Minden kiadott parancsod, ha másképp nem rendelkezel, az aktuális könyvtárral dolgozik. Pl. ha egy fájlt akarsz másolni, és nem írod le, hogy az hol van, a másoló parancs az aktuális könyvtárban fogja azt keresni. A cd (Change Direcory) paranccsal lehet egy másik könyvtárat aktuálissá tenni, azaz mozogni a könyvtárrendszerben. A parancsnak egy kötelező paramétere van, a könyvtár neve, amit aktuálissá akarsz tenni (úgy is mondjuk, amibe be akarsz lépni). A könyvtár leírását vagy az aktuális könyvtárhoz képest adjuk meg, vagy a gyökérkönyvtárhoz viszonyítva. Az előbbit relatív (hiszen csak az aktuális könyvtárban érvényes), az utóbbit abszolút elérési útnak nevezik. Az elérési útban néhány speciális jelölés is használható speciális könyvtárak jelölésére. Lássunk néhány példát!

  • A cd programok/teszt parancs az aktuális könyvtárból nyíló programok könyvtárból nyíló teszt könyvtárba lép. Ez a relatív elérési út, mivel az aktuális könyvtárból indul ki.
  • A cd /etc/X11 parancs a gyökérkönyvtárból nyíló etc könyvtárból nyíló X11 könyvtárat teszi aktuálissá. Ez az abszolút elérési út, mert bármelyik könyvtárban is vagy, mindenképp a gyökérkönyvtárhoz képest adtad meg a könyvtár helyét.
  • A cd .. az aktuális könyvtárból egy szinttel feljebb lép. A működése azon alapul, hogy minden könyvtárban van egy .. nevű könyvtár, amely a könyvtár létrehozásakor automatikusan keletkezett. Ezt a rendszer úgy hozza létre, hogy az a szülő könyvtárra mutat. A cd .. hatására ezért lépünk a szülő könyvtárra, nem pedig azért, mert ez valamilyen speciális változó vagy paraméter lenne. Van még egy másik könyvtár is, ennek neve egyetlen pontból áll. Ez magára a könyvtárra mutat, ami most még értelmetlennek tűnik, de néhány parancs esetében kifejezetten jól jön, még látunk erre példát majd. TODO példa a . könyvtárra.
  • A cd ~ jelentése ugynanaz, mint a cd parancs paraméter nélküli kiadásának, a saját home könyvtáradba lépsz vele.
  • A cd ~<felhasználó> a felhasználó home könyvtárába lép. A cd ~szabo.bela eredményeként tehát a szabo.bela home könyvtárába.
  • A fentiek tetszőlegesen kombinálhatók, tehát ennek is van értelme: cd ~bela/../teszt. Az értelmezését rád bízom, rakd össze az egyes elemeket!
  • Ne felejtsd el a Tab használatát a cd használatakor sem! Ezzel nagyon gyorsan tudsz majd dolgozni, és nem fogsz gépelési hibákat véteni!

A fenti példákban látható paraméterek nem csak a cd esetében használhatók, hanem minden könyvtárhivatkozáskor is. Ezért nyugodtan általánosíts, minden parancs esetén, ahol könyvtárat adhatsz meg, használhatod a .., ., ~, és a ~<felhasználó> elemeket is.

3.3.4. tree

A tree parancs nem része minden Unix rendszernek, külön telepíthető fel. A könyvtárakkal történő munka során néha jól jön, mert vizuálisan képes megjeleníteni a könyvtárrendszert az aktuális, vagy meghatározott ponttól. Paraméterei: * A -d hatására csak a könyvtárakat rajzolja ki, az abban levő fájlokat nem. Alapesetben a fájlok is megjelennek, így a tree / hatására a rendszer összes könyvtára és az abban levő összes fájl megjelenítésre kerül, csak győzd kivárni. Lássunk egy példát, a /etc könyvtárból nyíló könyvtárstruktúra megjelenítését! Csak a könyvtárak érdekelnek, ezért használom a -d kapcsolót. Az ábra a kimenet egy részletét tartalmazza:

feri@columbo:/etc$ tree -d
.
├── acpi
│   └── events
├── alternatives
├── apm
│   └── event.d
├── apparmor
│   └── init
│       └── network-interface-security
├── apparmor.d
│   ├── abstractions
│   │   ├── apparmor_api
│   │   └── ubuntu-browsers.d
│   ├── cache
│   ├── disable
│   ├── force-complain
│   ├── local
│   ├── snap
│   │   └── abstractions
│   │       ├── apparmor_api
│   │       └── ubuntu-browsers.d

3.3.5. mkdir

Új könyvtár létrehozására az mkdir (Make Directory) való. Paraméterként a létrehozandó könyvtár nevét kell megadnod. Így a mkdir teszt elkészít egy új teszt nevű könyvtárat az aktuális könyvtárban.

Tip

  • Sok parancs esetében, ahol egy fájl vagy könyvtár megadható, többet is felsorolhatsz, így van ez az mkdir esetében is. Az mkdir prg1 prg2 prg3 kiadásakor mindhárom könyvtár létrejön az aktuális könyvtárban, tehát ehhez nem kell három parancsot kiadnod.
  • Az előző feladat még “unixosabban” is megoldható így: mkdir prg{1..3}. A kapcsos zárójelek közti kifejezés a shell számára egy ciklust jelent 1-től 3-ig, így az valójában ezt futtatja le: mkdir prg1 prg2 prg3. Fontos, hogy értsd, nem az mkdir végzi ezt az értelmezést éppúgy, mint a korábban bemutatott *, ? stb. értelmezését sem.

Az mkdir esetében hibaüzenetet kapsz, ha olyan könyvtárat akarsz létrehozni, amelynek a szülő könyvtára nem létezik, pl. a mkdir programs/prg1 csak akkor működik, ha a programs könyvtár már létezik. Ez sokszor zavaró, ezért az mkdir rendelkezik egy paraméterrel, amelyet használva a parancs a paraméterében szereplő minden részkönyvtárat létrehoz, a példában először elkészíti a programs, majd ez követően a prg1 könyvtárat. Az alábbi példában ezt láthatod:

feri@columbo:~/demo$ mkdir programs/prg1
mkdir: nem lehet a következő könyvtárat létrehozni: ”programs/prg1”: Nincs ilyen fájl vagy könyvtár
feri@columbo:~/demo$ mkdir -p programs/prg1
feri@columbo:~/demo$ tree
.
└── programs
    └── prg1

2 directories, 0 files

3.3.6. rmdir

Könyvtárak törlésének irodalmi parancsa az rmdir. Paramétere a törlendő könyvtár neve, melynek üresnek kell lennie, tehát nem tartalmazhat sem fájlt, sem újabb könyvtárat. Ha vannak ilyenek, először azokat kell törölni, vagy az rm parancsot kell használni helyette.

feri@columbo:~/demo$ rmdir programs/prg1
feri@columbo:~/demo$ tree -d
.
└── programs

1 directory

Danger

Unix alatt nincs lehetőség a törölt fájlok helyreállítására, ezért nagyon nagy figyelmet kell fordítanod a törlést végző parancsok kiadásakor! Ha hibázol, és olyan fájlokat is törölsz, amelyekre szükséged van, csak a mentésből állíthatod helyre azokat!

3.3.7. rm

A könyvtárak törlésére sokkal hatékonyabb parancs az rm. Ez eredetileg fájlok törlésére szolgált, de a -r paraméterrel könyvtárak rekurzív törlésére használható akkor is, ha az nem üres.

feri@columbo:~/demo$ rm -r programs/
feri@columbo:~/demo$ tree
.

0 directories, 0 files

Note

A -r kapcsolót számos esetben használják annak jelölésére, hogy a parancsot nem csak a megadott könyvtárban kell végrehajtani, hanem az abbó nyílók mindegyikében. Mivel egy könyvtárrendszer bejárásának kézenfekvő módja a rekurzió, ezért -r a kapcsoló neve.

3.3.8. mv

A gyakorlaban hasznos, ha van lehetőséged könyvtárak áthelyezésére, erre az mv parancs szolgál. Hogy a helyzet ne legyen annyira egyszerű, ugyanez a parancs kell ahhoz is, hogy átnvezhess egy könyvtárat. Az, hogy melyik műveletet hajtod végre, a paraméterek megadásától függ. Az mv programs target parancs eredménye áthelyezés lesz, ha a target könyvtár létezik. Az programs könyvtár új helye a target lesz.

feri@columbo:~/demo$ mkdir -p programs/prg1
feri@columbo:~/demo$ mkdir target
feri@columbo:~/demo$ tree -d
.
├── programs
│   └── prg1
└── target

3 directories
feri@columbo:~/demo$ mv programs/ target/
feri@columbo:~/demo$ tree -d
.
└── target
    └── programs
        └── prg1

3 directories

Most lássuk, mi történik, ha a target könyvtár nem létezik! Az mv programs target most, mivel a célkönyvtár nem létezik, átnevezést hajt végre, a programs új neve target lesz.

feri@columbo:~/demo$ mkdir -p programs/prg1
feri@columbo:~/demo$ mv programs/ target/
feri@columbo:~/demo$ tree
.
└── target
    └── prg1

2 directories, 0 files

3.3.9. cp

A könyvtárak másolását a cp paranccsal lehet elvégezni. Paraméterként meg kell adni a forrás és a célkönyvtárat is. Lássuk ezt egy példán keresztül!

feri@columbo:~/demo$ tree
.
└── target
    └── prg1

2 directories, 0 files
feri@columbo:~/demo$ mkdir tmp
feri@columbo:~/demo$ cp -r target tmp
feri@columbo:~/demo$ tree
.
├── target
│   └── prg1
└── tmp
    └── target
        └── prg1

5 directories, 0 files

A cp -r target tmp parancsban a forrás (amit másolni fogunk) a korábban már létrehozott target, a cél pedig a most készített tmp könyvtár. A -r kapcsolóra azért van szükség, hogy a cp számára jelezzük, a target teljes tartalmát, annak minden könyvtárát és fájlját is másolni kell. Enélkül a parancs nem működött volna:

feri@columbo:~/demo$ tree
.
├── target
│   └── prg1
└── tmp

3 directories, 0 files
feri@columbo:~/demo$ cp  target tmp
cp: ”target” könyvtár kihagyása

3.3.10. A Unix könyvtárrendszere

/bin:A felhasználók által indítható parancsok helye, amelyekre már a rendszer felállása során szükség van.
/boot:Az operációs rendszer betöltéséhez szükséges fájlok, boot manager, kernel, initrd vannak itt.
/dev:Az eszközfájlok szokásos könyvtára.
/etc:A rendszer konfigurációs fájljainak gyűjtőhelye.
/home:A felhasználók home könyvtárainak kiindulópontja.
/media:A felmountolt meghajtók jellegzetes elérési pontja.
/mnt:Szintén mount pontként használatos.
/opt:K
/proc:A procfs mount pontja.
/root:A rendszergazda home könyvtára.
/run:A futó programok átmeneti fájljainak helye. Rendszerint a memóriát használja, az itt levő fájlok nincsenek a diszken.
/sbin:A rendszergazda által használható parancsok helye, azoké, amelyekre már a boot folyamat során szükség van.
/srv:A
/tmp:Az átmeneti fájlok könyvtára. Rendszerint ez is a memóriát használja, az itt levő fájlok nincsenek a diszken.
/usr:A felhasználói programok tárolásának kiindulási helye.
/usr/local/bin:A helyi rendszergazda által telepített programok helye. Ezek nem az operációs rendszer részei.
/usr/bin:A felhasználók által indítható parancsok helye, amelyekre csak a rendszer felállása után van szükség.
/usr/sbin:A rendszergazda által használható parancsok helye, ide azok kerülnek, amelykre a rendszer indulása során nincs szükség.
/var:Változó tartalmú fájlok, adatbázisok, weblapok, levelek stb. kerülnek ide.

3.4. Fájlkezelő parancsok

A fájlok kezelésére is számos parancsot kínál az operációs rendszer.

3.4.1. cat

Egy fájl tartalmának megjelenítésére szolgáló parancs a cat. Értelemszerűen legalább egy paramétere kell, hogy legyen, a megjelenítendő fájl neve. Lássunk egy példát! A /etc/passwd fájl a rendszer felhasználóinak adatait tartalmazza, a bejelentkezés során fontos szerepe van. A jogosultsági rendszer tárgyalásakor részletesen megismerjük a felépítését. Most lássuk a tartalmát! (A fájl columbo.uni-eszterhazy.hu gépen elég hosszú, ezért nem mutatom a teljes tartalmat, csak az első 10 sorát.)

feri@columbo:~/demo$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin

A cat számos paraméterrel rendelkezik, megmutatok néhnyat, amit néha jól használhatsz. A -n kapcsolóval a cat megsorszámozza a sorokat:

feri@columbo:~/demo$ cat -n /etc/passwd
     1  root:x:0:0:root:/root:/bin/bash
     2  daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
     3  bin:x:2:2:bin:/bin:/usr/sbin/nologin
     4  sys:x:3:3:sys:/dev:/usr/sbin/nologin
     5  sync:x:4:65534:sync:/bin:/bin/sync
     6  games:x:5:60:games:/usr/games:/usr/sbin/nologin
     7  man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
     8  lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
     9  mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
    10  news:x:9:9:news:/var/spool/news:/usr/sbin/nologin

A -s kapcsolóval a többszörös üres sorok egy üres sorra cserélhetők. Az alábbi példában a teszt.txt több üres sort tartalmaz:

feri@columbo:~/demo$ cat teszt.txt
első sor


második sor



harmadik sor

A -s kapcsolóval a többszörös üres sorok egy sorra redukálódnak:

feri@columbo:~/demo$ cat -s teszt.txt
első sor

második sor

harmadik sor

Note

  • A parancs neve a Concatenate szóból származik, ugyanis a parancs eredeti célja nem egyetlen fájl tartalmának megjelenítésére, hanem több fájl egyesítésére, konkatenálására volt. Ennek megfelelően paraméterként számos fájlt adhatsz meg, ezek tartalmát sorban megjeleníti, konkatenálja.

3.4.2. Lapozóprogramok

A cat kimenete foyamatosan kiírásra kerül a képernyőre. Hosszú fájl esetén nem fogod tudni elolvasni a tartalmát, mert az pillanatok alatt eltűnik, csak a fájl végét fogod látni. Ha emlékszel a Ctrl-s és a Ctrl-q billentyűk jelentésére, akkor játszhatsz ezekkel, de ennél azért komolyabb megoldásra van szükség. Ezért az egyes rendszerek más parancsokat is tartalmazhatnak erre a feladatra, olyanokat, melyek támogatják a felhasználót abban, hgy kényelmesen elolvashassa a fájl tartalmát. Ezek a korábban már említett lapozó programok.

A legegyszerűbb lapozóprogram a more. Ez a fájl tartalmát úgy jeleníti meg, hogy minden képernyőnyi tartalom megjelenése után megállítja az újabb sorok kiírását, és szóköz megnyomásáig vár. Ez után újabb képernyőnyi tartalom jelenik meg, és így folytatódik a fájl végének eléréséig. A / megnyomása után meg lehet adni egy keresendő szöveget, az n a következő találatot adja. A q megnyomásával ki lehet lépni a programból. A more tudása ezzel ki is merül, nem igazán okos, nagyon zavaró a visszafelé lapozás képességének hiánya.

feri@columbo:~/demo$ more /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
--Tovább--(9%)

Jobban használható változat a less. A neve szójáték, jelentésében kevesebb, de valójában többet tud, mint a more. Itt már működik a visszafelé lapozás, lehet visszafelé is keresni a b megnyomásával, így nekem a gyakorlatban már teljesen megfelel.

Sokan használják a most parancsot lapozóprogramként, ez még nagyobb szolgáltatási kört nyújt.

Note

Emlékezz rá, a man parancs valójában valamelyik lapozóprogramot hívja meg, és azzal végzi a kézikönyv megjelenítését. Hogy melyiket használja, azt a PAGER környezeti változó határozza majd meg, erről részletesen a környezeti változóknál olvashatsz.

3.4.3. cp

A könyvtárak másolása után a cp használata már nem jelent problémát, ha fájlokat kell másolnod. Fájlok csoportja is másolható, ha a helyettesítő karaktereket használod, a *, a ? és a [] segítségével fájlok csoportjait tudod egy lépésben másolni. Egy példa: legyen az aktuális könyvtár a gyökérkönyvtár, és másold a /etc könyvtár összes conf kiterjesztésű fájlját a home könyvtárad backup könyvtárába!

feri@columbo:/$ mkdir ~/backup
feri@columbo:/$ cp /etc/*.conf ~/backup

A másolás során megadhatsz egy új fájlnevet is, az alábbi példában a másolat neve jelszavak.txt lesz:

feri@columbo:~/demo$ cp /etc/passwd tmp/jelszavak.txt
feri@columbo:~/demo$ tree
.
├── target
│   └── prg1
└── tmp
    └── jelszavak.txt

3 directories, 1 file

3.4.4. mv

A fájlok áthelyezése és átnevezése sem hoz már nagy újdonságot, ha az eddigieket megértetted. Az áthelyezés folyamata pontosan az, mint a másolásé, a különbség csak az, hogy a sikeres másolást követően a forrás fájlokat a parancs törli. Az áthelyezés elve sem változott, ha a cél nem létezik, áthelyezés, egyébként átnevezés történik. Lássunk erre is néhány példát!

Először másold a /etc/passwd fájlt az aktuális könyvtárba! Mivel a cp parancsnak mindenképp meg kell adni a cél könyvtárat abban az esetben is, ha az aktuális könyvtár, a . karaktert használjuk erre. Figyeld meg ezt a cp parancsban!

feri@columbo:~/demo$ cp /etc/passwd .
feri@columbo:~/demo$ tree
.
├── passwd
├── target
│   └── prg1
└── tmp
3 directories, 1 file

Helyezd át ezt a fájlt a tmp könyvtárba!

feri@columbo:~/demo$ mv passwd tmp/
feri@columbo:~/demo$ tree
.
├── target
│   └── prg1
└── tmp
    └── passwd
3 directories, 1 file

Nevezd át a passwd fájlt! Az új név legyen jelszavak.txt! Ebben a feladatban, mivel átnevezésről van szó, a forrás és a cél könyvtára meg kell, hogy egyezzen.

feri@columbo:~/demo$ mv tmp/passwd tmp/jelszavak.txt
feri@columbo:~/demo$ tree
.
├── target
│   └── prg1
└── tmp
    └── jelszavak.txt

Az alábbi megoldás is helyes lett volna, és a gyakorlatban atlán egyszerűbb is:

feri@columbo:~/demo$ cd tmp
feri@columbo:~/demo$ mv passwd jelszavak.txt

3.4.5. rm

Az rm a könyvtárak mellett fájlok törlésére is szolgál. Paraméterként a törlendő fájlok nevét kell megadni, ennél a parancsnál is használhatók a helyettesítő karakterek. Ahogyan a könyvtáraknál, a fájlok törlésekor is nagyon figyelj, nehogy olyan fájlokat is törölj, amit nem szeretnél, a törlés visszavonására nincs mód. Ha bizonytalan vagy, a törlés előtt listázd ki azokat a fájlokat, amikre a törlés parancsát kiadod. Ezt teszem az alábbi példában:

feri@columbo:~/demo$ ls tmp/j*
tmp/jelszavak.txt
feri@columbo:~/demo$ rm tmp/j*

3.4.6. file

A Windows rendszerekben egy fájl típusáról annak kitejesztése ad információt. Egy docx fájl Word dokumentumot, egy xlsx egy Excel munkafüzetet jelent. Az összerendelés elég merev, a fájlon duplán kattintva a Word, illetve az Excel indul majd el. Unix alatt ez nincs így, a fáljoknak lehet kiterjesztése, de ez nem feltétlenül van így. Ezért egy fájl típusának meghatározása nem történhet erre alapozva. A file parancs információt ad egy fájl tartamáról úgy, hogy megpróbálja az tartalma alapán felismerni. A parancshoz egy adatbázis is tartozik, amely alapján működik. Az alábbi példában egy képfájlt vizsgálunk:

koczka.ferenc@ns:~/unixBook$ file source/_images/sitelogo.png
source/_images/sitelogo.png: PNG image data, 255 x 98, 8-bit/color RGB, non-interlaced

3.4.7. touch

Ezt a parancsot egy új, üres fájl létrehozására szoktam használni. Valójában nem erre való, ez csak egy mellékhatása, az eredeti célja a fájl idő adatainak megváltoztatása. Lássunk erre is egy példát!

feri@columbo:~/demo$ ls -l
összesen 8
drwxrwxr-x 3 feri feri 4096 júl    2 20:55 target
drwxrwxr-x 2 feri feri 4096 júl    2 22:35 tmp
feri@columbo:~/demo$ touch hello.txt
feri@columbo:~/demo$ ls -l
összesen 8
-rw-rw-r-- 1 feri feri    0 júl    2 22:47 hello.txt
drwxrwxr-x 3 feri feri 4096 júl    2 20:55 target
drwxrwxr-x 2 feri feri 4096 júl    2 22:35 tmp

3.4.8. diff, patch

A diff két fájl összehasonlítására szolgál, paraméterként a két fájl nevét kell megadni. Amennyiben ezek azonosak, a diff nem ír ki semmit, ha különböznek, akkor leírja a különbségeket úgy, hogy az más programok számára felhasználható legyen. A file:hello.txt fájl tartalma a Hello szó, lássunk egy példát!

feri@columbo:~/demo$ cat hello.txt
Hello
feri@columbo:~/demo$ cp hello.txt masolat.txt
feri@columbo:~/demo$ diff hello.txt masolat.txt

Miután a masolat.txt fájlban töröltem az o betűt:

feri@columbo:~/demo$ diff hello.txt masolat.txt
1c1
< Hello
---
> Hell

Programkódok esetén nem optimális, ha egy kis változás miatt a teljes forrást újra le kell töltened, hogy a legfrissebb változattal rendelkezz. A diff kimenete és a patch parancs kiváló eszköz arra, hogy a változásokat a nálad levő forrásban is átvezesd. Ennek során a diff kimenetéből egy kisméretű patch fájl készül, amelyet felhasználva a patch parancs előállítja a javított verziót. Neked csak a patch fájlt kell letöltened és a korábbi verziót “megpatchelned”. Egy rövid példa a használatára (az átirányítások miatt lehet, hogy csak később lesz érthető ez a példa):

feri@columbo:~/demo$ diff hello.txt masolat.txt >patch.txt
feri@columbo:~/demo$ cat masolat.txt
Hell

feri@columbo:~/demo$ patch -p0 masolat.txt <patch.txt
patching file masolat.txt
Reversed (or previously applied) patch detected!  Assume -R? [n] y
feri@columbo:~/demo$ cat masolat.txt
Hello

Note

Ha foglalkozol programozással, biztosan találkoztál már a verziókezelő rendszerek valamelyikével, a Gittel vagy az SVN-nel. Ezek működése is a diff parancson alapul.

3.5. A linkek

A Windowsban már találkozhattál a parancsikonokkal, ennek két megvalósítása is létezik a Unix fájlrendszereiben, a hardlink és a softlink. Ezek ugyanazt a célt szolgálják, de más úton érik azt el. A cél mindkét esetben ugyanaz: ha egy fájlra vagy könyvtárra újabb directory bejegyzést készítesz, ezzel az eredetit egy másik úton is el lehet érni. A linkek használata nagyban leegyszerűsítheti a gyakorlati munkát, mivel nem kell hosszú könyvtárneveket, fájlneveket megjegyezned, vagy gépelned.

3.6. Fájlrendszerek csatolása

A Microsoft operációs rendszereiben az egyes meghajtókat az ábécé betűivel jelölik. Az A: meghajtó a mágneslemezes meghajtót jelenti, a C: a merevlemezt, a D: pl. egy DVD olvasót.

Putty beállítása

Ez a módszer más rendszerekben nem jellemző, inkább a fájlrendszerek csatolását használják. Lássuk ennek lényegét egy példán! Az operációs rendszert az ábra bal oldalán látható háttértár tartalmazza, az egyszerűség kedvéért vsak néhány könyvtárat rajzoltunk meg. Emellett van két másik meghajtónk, az egyik legyen egy zenefájlokat tratalmazó pendrive, a másik pedig egy újabb merevlemez:

Putty beállítása

Az operációs rendszer a pendrive-ot és a külső diszket a fenti állapotában nem tudja elérni, azokat először csatolni (mountolni) kell. Ennek során a meghajtó fájlrendszerének gyökérkönyvtárát a rendszer valamelyik könyvtárába kapcsoljuk, így az beilleszkedik az operációs rendszert tartalmazó meghajtó könyvtárrendszerébe. Az alábbi ábrán a csatolás utáni állapot látható, a pendrive a media/zenek könyvtárba, a másik merevlemez a /home könyvtárba.

Putty beállítása

Note

  • A csatolásról részletesen tanulunk még a fájlrendszerek csatolásáról szóló részben.
  • Biztosan tudod, hogy egy merevlemezt több részre lehet osztani (partícionálni), és ezeket a részeket önálló meghajtóként lehet használni. Ezeket a részeket szintén mountolni kell. A partícionálásról később itt olvashatsz.
  • Ha Android rendszerű mobiltelefonod van, melyben SD kártyát is használsz, ott is találkozhatsz a csatolással. Ahhoz, hogy elérd a kártya tartalmát, a /mnt/sdcard könyvtárba kell lépned.
  • Ha a csatolást megelőzően a csatolási pontul szolgáló könyvtárban fájlok vagy további könyvtárak vannak, azok a csatolást követően nem érhetők el, a csatolt fájlrendszer gyökérkönyvtára “letakarja” azokat. Ilyen pontok az ábrán a /media/zenek és a /home.
  • A csatolást (mountolást) és a lecsatolást (umountolást) csak a rendszer adminisztrátora végezheti.
  • A Windows operációs rendszer is képes a csatolásra, de abban ezt ritkán használják.

3.6.1. df

A napi munka során időről időre felmerülhet a kérdés: mennyi szabad hely van az adott meghajtón? Erre, és néhány ehhez kapcsolódó kérdésre a df (disk free) parancs ad választ. Az alábbi példában a parancsnak még egy -H (human readable) kapcsolót is adunk, ezzel az egyes területek nagyságát nem bájtban, hanem az ember számára lekönnyebben értelmezhető egységben (Kilobájt, Megabájt, Gigabájt) írja ki.

feri@columbo:~$ df -H
Fájlrendszer   Méret Fogl. Szab. Fo.% Csatol. pont
udev            510M  4,1k  510M   1% /dev
tmpfs           105M  541k  104M   1% /run
/dev/sda1       3,9G  2,3G  1,4G  63% /
none            4,1k     0  4,1k   0% /sys/fs/cgroup
none            5,3M     0  5,3M   0% /run/lock
none            522M     0  522M   0% /run/shm
none            105M     0  105M   0% /run/user
/dev/sda3        13G  1,9G  9,9G  16% /home

A példában két sor érdekes számunkra, a /dev/sda1 és a /dev/sda3 kezdetű. Ez a gépben levő, két részre osztott (partícionált) merevlemez adatait írja le. Az operációs rendszer a /dev/sda1-en van, 3.9 GByte méretű, amelyből 2.3G foglalt, még 1.4G szabad hely van rajta. A 13Gb méretű /dev/sda3 a /home könyvtárba van csatolva, 1.9G foglalt, 9.9G szabad rajta. A többi sor nem fizikai eszközt jelöl, ezekkel később foglalkozunk majd.

3.6.2. du

A du egy adott könyvtárban levő bejegyzések (fájlok, könyvtárak, linkek) által elfoglalt helyről ad információt. Két módot mutatok a használatára.

Egy könyvtár által elfoglalt hely kiírására a -s kapcsolóval lehet használni. Példánkban ez 1.765.784 bájt.

root@columbo:/home# du -s
1765784 .

Ha emberi formában (human readable) szeretnéd:

root@columbo:/home# du -sh
1,7G    .

Az alábbi példa szerinti paraméterezést a gyakorlatban szoktam használni, ezzel meg lehet állapítani, hogy melyik könyvtár mennyi helyet foglal el a háttértáron. Főleg akkor hasznos, ha a diszk betelőben van, és meg kell keresem, hogy melyik könyvtár mérete lett indokolatlanul nagy. A paraméterben szereplő * hatására a parancs nem egy összesített értéket jelenít meg, hanem bejegyzésenként számítja ki a foglaltságot.

root@columbo:/home# du -sh *
4,0K    2014
56M     2015
1001M   2016
655M    2017
500K    andris
20K     B73JYX
20K     C3XYVK
216K    CNT3OM
736K    feri
64K     kiraly.roland
28K     koczka.ferenc
40K     koczkapeter
20K     KPULU6
16K     lost+found
12M     magyarp
4,0K    teszt.txt
248K    WD4PYQ