
</motto<"Everything in the </sc unix> system is a file.">>

/chapter<Tiedostoj{rjestelm{>
 
</sc Unix>in /ii<tiedostoj{rjestelm{> on hierarkinen,
samaan tapaan kuin </sc/ii<vms>>:ss{ tai </sc/ii<ms-dos>>:ssa. Itse asiassa
</sc ms-dos> on lainannut tiedostoj{rjestelm{n ja useita sen
hallintaan liittyvi{ komentoja </sc unix>ista, joten
PC-k{ytt{j{ kotiutuu helposti </sc unix>-maailmaan. 
 
/section<Unixin tiedosto>

</sc Unix>in tiedosto on aina rakenteeltaan jono (8-bitin)
tavuja eli merkkej{.  Tiedostolla ei ole mit{{n muuta
rakennetta, eik{ sen sis{ll|ll{ oikeastaan merkityst{k{{n. 
Sek{ tiedoston rakenne ett{ sen sis{lt{mien tavujen merkitys
riippuvat ainoastaan siit{, miten kyseist{ tiedostoa lukevat
ja kirjoittavat ohjelmat tulkitsevat tiedostossa olevat tavut.
Tiedostossa olevat tavut saavat siis
merkityksens{ vasta niit{ k{sittelevien ohjelmien kautta. 

/iii<unixin laitteet> </sc Unix>issa my|s laitteet
(oikeammin niiden /ii<laiteohjaimet>) ovat tiedostoja, ns.  
</sl/ii<erikoistiedosto>ja> (/ii<special file>s). 

Useat </sc unix>in tiedostot ovat ns. </sl/ii<tekstitiedosto>ja>. Niiss{ on
enemm{n tai v{hemm{n s{{nn|llisin v{lein ns. </tt/ii<newline>>-merkkej{
(jotka useimmissa </sc unix>-toteutuksissa itse asiassa ovat
</tt/ii<linefeed>>-kontrollimerkkej{), jotka jakavat sen riveihin.
Muuten kukin rivi sis{lt{{ vaihtuvan m{{r{n kirjoittuvia
ASCII-merkkej{, ja mahdollisesti tabulaattorimerkkej{ (ASCII </tt
tab>) ja sivunvaihtomerkkej{ (</tt formfeed>). Useimmiten muita
kontrollimerkkej{ tekstitiedostossa ei ole, ei edes 
</tt return>-merkkej{.

Tekstitiedoston vastakohta on </sl/ii<bin{{ritiedosto>>,
jossa yleens{ voi olla kaikkia kahdeksan bitin tavuja ja
jota ei voi lukea "selv{kielisen{".  Se sis{lt{{ jonkin
asian "koodatun" muodon, kuten k{{nt{j{n tuottama
</sl/ii<objektitiedosto>> tai linkitt{j{n tuottama ajettavaa
konekoodia sis{lt{v{ </sl/ii<absoluuttitiedosto>>. 
(Tarkkaan ottaen toki tekstitiedostokin on bin{{rinen, mutta
se eroaa muista bin{{ritiedostoista siten, ett{ siin{ on
tavallisesti vain kirjoittuvia merkkej{ --- ja viel{
"j{rkev{ss{" j{rjestyksess{ --- ja vain muutamia
kontrollimerkkej{.)


/section</ii<Tiedostojen nimet>>

Alunperin </sc unix>issa tiedoston (tai hakemistotason)
nimen pituus oli korkeintaan 14 merkki{.  T{m{ rajoitus on
kuitenkin useimmissa toteutuksissa j{{nyt historiaan; mm. 
/ii<Sun>-ty|asemissa ja </sc/ii<finsun>>-palvelukoneessa
nimen maksimipituus on per{ti 256 merkki{. 
Supertietokoneessa se kuitenkin on edelleen vain 14 merkki{. 

Nimess{ voi periaatteessa olla melkein mit{ tahansa merkkej{, mutta
ei ole j{rkev{{ laittaa sinne mit{ tahansa, koska useilla merkeill{
on erityismerkitys komentotulkille (shellille), tai ne ovat muutoin
"hankalia" k{sitell{.  Turvallisia merkkej{ ovat ainakin pienet ja
isot kirjaimet, numerot, piste ja alaviiva: 

</copymode
      abcdefghijklmnopqrstuvwxyz
      ABCDEFGHIJKLMNOPQRSTUVWXYZ
      0123456789
      ./_
>

Yleens{ erikoismerkit eiv{t ole j{rkevi{ (tavallisen)
tiedoston ensimm{isen{ merkkin{.  Huomaa, ett{ </sc unix>
erottaa isot ja pienet kirjaimet sek{ komentojen ett{
tiedostojen ja hakemistojen nimiss{ (</sc<unix>> is
case-sensitive!) </sc Unix>issa komentojen ja tiedostojen nimet 
kirjoitetaan tavallisesti </bf pienill{> kirjaimilla. 
 
/subsection</ii<Jokerimerkit>>

Tiedostoihin viitattaessa voidaan usein --- samantapaisesti
kuin </sc vms> ja </sc dos> -k{ytt|j{rjestelmiss{ --- k{ytt{{ ns. 
jokerimerkkej{ (/ii<wild card characters>).  N{it{ merkkej{
on </sc unix>issa kaksi:

/iii<*> /iii<?>
</copymode
      *     </rm mik{ tahansa merkkijono, my|s tyhj{>
      ?     </rm mik{ tahansa yksitt{inen merkki>
>

Kysymysmerkki tarkoittaa siis mit{ tahansa yht{ merkki{ ja
t{hti mit{ tahansa nollan tai useamman merkin merkkijonoa. 
N{m{ poikkeavat kuitenkin sek{ </sc dos> ett{ </sc vms>
-j{rjestelmist{ siin{, ett{ </sc unix>issa komentojen
argumentteina on useimmiten tiedostonimen paikalla
kokonainen lista tiedostonimi{.  Tiedostonimilistan saa
muodostettua yksinkertaisesti esimerkiksi 
</tt *>-jokerimerkill{.  Oleellista kuitenkin on, ett{ kyseinen
komento ei tied{ mit{{n t{st{ </tt *>:st{, vaan shell
laajentaa m{{rittelyn, jossa </tt *> esiintyy, suoraan
listaksi.  Siis komento ei edes n{e t{t{ t{hte{, vaan
lopullisen /ii<tiedostolista>n!

/iii<jokerimerkkien tulkinta>
Oleellista on siis se, ett{ /ii<komentotulkki> tulkitsee
jokerimerkit itse, korvaten niit{ sis{lt{v{n tiedostoviittauksen
(mahdollisesti tyhj{ll{) tiedostolistalla, ja suoritettava komento
n{kee vain t{m{n listan.

T{m{ on syy, miksi komento

</copymode
      mv roska.* rotta.*
>

ei toimi, jos tarkoitus on nimet{ kaikki </tt roska>-alkuiset tiedostot 
</tt rotta>-alkuisiksi; nimitt{in komentotulkki saattaa laajentaa sen
esimerkiksi komennoksi

</copymode
      mv roska.a roska.b roska.1 rotta.hiiri rotta.o
>

joka yritt{{ siirt{{ muut esiintyv{t tiedostot viimeisimp{{n
(jonka pit{isi viel{ olla hakemisto).  (Komentoa </tt
/ii<mv>> k{sitell{{n luvussa /ref<8.6.2>)


/section<Tiedoston tyyppi>

/iii<tiedostotyypit>
Tiedostolla ei ole </sc unix>-k{ytt|j{rjestelm{n ymm{rt{m{{ "tyyppi{".
Silti on j{rkev{{ osoittaa tiedoston k{ytt|tarkoitus sen nimess{,
esimerkiksi </sc fortran>-kielisen ohjelman sis{lt{v{n tiedoston nimi
p{{ttyy yleens{ merkkeihin </tt .f>.

Edelleen tiedoston "tyyppi" --- edell{ </tt .f> --- ei ole
erillinen osa tiedoston nime{, vaan olennainen osa sit{, joten sek{
piste ett{ kirjain </tt f> lasketaan tiedoston nimen pituuteen
mukaan.  N{m{ tiedoston tyyppi{ osoittavat nimen
laajennusosat ovat siis vain konventionaalisia, tavanmukaisesti
k{ytettyj{, ja siten ne pit{{ yleens{ kirjoittaa nimeen mukaan
kokonaan (kuten </sc fortran>-k{{nt{j{lle </tt cft77 prog.f>).

Komennoilla ei yleens{ ole tiedostoille oletustyyppi{. Kuitenkin
esimerkiksi Fortran-k{{nt{j{ tuottaa komennolla </tt cft77 -em prog.f> 
listauksen tiedostoon, jonka nimen oletus on </tt .l>: </tt prog.l>.

/iii<tiedostoversiot>
Tiedostoilla ei my|sk{{n ole </sc vms>-k{ytt|j{rjestelm{st{ tuttuja versioita,
vaan uusi versio korvaa aina vanhan, jolloin </bf vanha versio katoaa
kokonaan>.  Jos kirjoitat uuden tiedoston, ja saman niminen on jo
ennest{{n olemassa, entinen tiedosto tuhoutuu sen kummempia
ihmettelem{tt{.  Vanhan version voi pelastaa vain jos siit{ on
olemassa varmuuskopio (nauhalla tai muualla levyll{ toisennimisen{).


/section</ii<Tiedostohierarkia>>

</sc Unix>issa (samoin kuin </sc/ii<vms>>:ss{ ja </sc/ii<ms-dos>>issa)
tiedostot voi ryhmitell{ /ii<hakemisto>iksi, jotka
muodostavat </sl puumaisen hakemistohierarkian>.
Eri k{ytt|j{rjestelm{t k{ytt{v{t hieman erilaista kielt{ ja
merkint|j{ (syntaksia) puhuessaan hakemistoihin liittyvist{ asioista,
mutta perusk{sitteet ovat silti suurinpiirtein samat.

</sc Unix>-k{ytt|j{rjestelm{ss{ ei tiedoston nimess{ esiinny laitteiden
nimi{, vaan siin{ on vain yksi /ii<juurihakemisto>, ja koko
tiedostohierarkia muodostaa yhden suuren puun riippumatta siit{ mill{
(fyysisell{ tai loogisella) laitteella tiedostot sijaitsevat. Itse
asiassa my|s ns. /ii<erikoistiedostot>, jotka edustavat oheislaitteita tai
oikeammin niiden laiteohjaimia  (device drivers), kuten levy/-ase/-mia,
nauha-asemia, tulostimia ja p{{tteit{, n{kyv{t </sc unix>-j{rjestelm{ss{
tiedostoina. Fyysisi{ tai loogisia levy-yksik|it{ vastaavat 
</sl/ii<tiedostosysteemi>t>, jotka </tt/ii<mount>>-komennolla liitet{{n
tiedostoj{rjestelm{n osaksi (oksaksi).

Tiedostohierarkian puurakenteen ylimm{ll{ tasolla
olevaan hakemistoon (eli puun juureen) viitataan 
kauttaviivalla (</tt //>). /iii<//>
Hakemistossa voi olla sek{ tiedostoja ett{ /ii<alihakemisto>ja,
ja alihakemistoissa taas tiedostoja ja uusia alihakemistoja.

/iii<p{{k{ytt{j{hakemistot>
Crayn juurihakemistosta l|ytyy eri p{{k{ytt{jille
varattuja hakemistoja, kuten </tt univ1>, </tt vtt> jne.
Hakemiston </tt univ1> alihakemistona on mm. </tt hy>, joka
sis{lt{{ kaikki Helsingin yliopiston k{ytt{j{t. 

Kullakin k{ytt{j{ll{ on t{m{n p{{k{ytt{j{hakemiston alla
alihakemistona edelleen oma </sl/ii<kotihakemistonsa>>
(/ii<home directory>).  Kun k{ytt{j{ kirjoittautuu koneeseen, h{n
joutuu automaattisesti omaan kotihakemistoonsa. 
 
T{ydellinen tiedostonimi sis{lt{{ varsinaisen tiedoston
nimen lis{ksi kaikkien sen yl{puolella olevien hakemistojen
nimet kauttaviivoilla erotettuina aina puun juuresta saakka.
Siten Helsingin yliopistossa ty|skentelev{n tutkijan
Isaskar H{m/"un (k{ytt{j{tunnus ihamu) tiedoston 
</tt huu.haa> t{ydellinen nimi olisi </tt//univ1//hy//ihamu//huu.haa>.
Onneksi n{in pitki{ nimi{ ei yleens{ tarvita, sill{
kullakin hetkell{ ollaan aina yhdess{ tietyss{ hakemistossa,
</sl/ii<nykyhakemisto>ssa> (/ii<working directory>).

Viitattaessa nykyhakemiston tiedostoihin riitt{{ pelkk{
tiedoston nimi.  Hakemistojen nimiss{ voidaan k{ytt{{ my|s
pistett{ (</tt .>), /iii<.> /iii<..> joka viittaa
nykyhakemistoon ja kahta pistett{ (</tt ..>), joka viittaa
nykyhakemiston yl{puolella olevaan hakemistoon.  
Siten </tt .//fyle> ja </tt fyle> viittaavat ihan samaan tiedostoon. 
 
Nykyhakemiston alihakemistoihin voidaan viitata antamalla
vain /ii<hakemistopolku> nykyhakemistosta kyseiseen
tiedostoon (/ii<suhteellinen hakemistopolku>).  Jos
esimerkiksi nykyhakemistossa on alihakemisto </tt ohjelmat>,
viitataan siell{ olevaan tiedostoon </tt 42.c> nimell{ </tt
ohjelmat//42.c>.  T{ss{ ei nimen alussa saa olla
kauttaviivaa.  Kauttaviivalla alkava nimi tarkoittaa aina,
ett{ nimess{ annetaan koko hakemistopolku juuresta l{htien
(/ii<absoluuttinen hakemistopolku>).

My|s /ii<kotihakemisto>on voidaan viitata tarvitsematta
kertoa sen yl{puolella olevia hakemistoja: mato (</tt/char'176>)
tiedoston nimess{ viittaa kotihakemistoon. 
Esimerkiksi </tt/char'176//42.c> on kotihakemistossa oleva
tiedosto </tt 42.c>.

/section</ii<Hakemistopolut>>

/iii<tiedoston absoluuttinen nimi>
Jokaisella tiedostolla on </sl t{ydellinen eli absoluuttinen nimi>,
joka koostuu </sl hakemistopolusta> ja tiedoston varsinaisesta
nimest{ (ja sen tyypist{ sek{ laitteesta ja joskus jopa verkon
solmusta, jossa tiedosto sijaitsee). Lis{ksi tiedostolle on
mahdollista antaa </sl suhteellinen eli relatiivinen polku>, joka
alkaa nykyhakemistosta alasp{in. 

Lis{ksi </sc unix>-j{rjestelm{ss{ voidaan k{ytt{{ /ii<ymp{rist|muuttujia>
(/ii<environment variable>s, esimerkiksi </tt HOME>, </tt TMPDIR>) ja
</sc vms>-j{rjestelm{ss{ loogisia nimi{ korvaamaan osa polusta.

Alla on esimerkkej{ eri k{ytt|j{rjestelmien tavasta ilmoittaa
hakemistoja: ensin on yleinen hakemisto, sitten juurihakemisto,
kotihakemisto ja tyypillinen alihakemistossa oleva tiedosto.

</def\</char'134>/def[</char'133>/def]</char'135>
/font/tt=cmtt8
/catcode`/\=12
/beginverbatim
VMS

     node::device:<homedir.subdir.subsubdir>file.type;version
     device:<000000>
     device:<username>
     <.subdir>file.type

UNIX

     /usr/users/username/subdir/file.type
     /
     /usr/users/username
     subdir/file.type



MS-DOS

     d:\direct\subdir\subsub\file.typ
     \
     \
     subdir\file.typ
/endverbatim>

Esimerkkej{ </sc unix>in tiedostopoluista:

</leftskip5mm
/font/tt=cmtt8
/beginverbatim
absoluuttisia:

/dir/a.out            # p{{hakemiston dir tiedosto a.out
/a.out                # juurihakemiston / tiedosto a.out
/dir/sdir/ndir/a.out  # absoluuttipolun varrella oleva a.out
                      #     (juurihakemiston alihakemistossa)

suhteellisia (alas):

a.out                 # nykyhakemiston tiedosto a.out
./a.out               # nykyhakemiston tiedosto a.out
sdir/a.out            # nykyhakemiston alihakemiston sdir
                      #     tiedosto a.out 
./sdir/a.out          # nykyhakemiston alihakemiston sdir
                      #     tiedosto a.out 
dir/sdir/ndir/a.out   # relatiivipolun  varrella oleva a.out
                      #     (nykyhakemiston alihakemistossa)

suhteellisia (yl|s):

../a.out              # nykyhakemiston {idin    tiedosto a.out
../../a.out           # nykyhakemiston iso{idin tiedosto a.out
../odir/a.out         # nykyhakemiston sisarhakemiston odir
                      #     tiedosto a.out 

kotihakemisto:

~/a.out               # kotihakemisto  tiedosto a.out (csh)
$home/a.out           # kotihakemisto  tiedosto a.out (csh)
$HOME/a.out           # kotihakemisto  tiedosto a.out (csh ja sh)
/endverbatim>


/section<Hakemisto- ja tiedostokomentoja>
 
Seuraavassa esitell{{n lyhyesti joitakin t{rkeimpi{ tiedostojen
ja hakemistojen hallintaan tarvittavia komentoja.
Komennot sis{lt{v{t todellisuudessa huomattavasti enemm{n
mahdollisuuksia kuin mit{ t{ss{ kerrotaan. Tarkempia tietoja 
haluavia kehotamme tutustumaan johonkin alan oppikirjaan.
 
 
/subsection</ii<Hakemistokomentoja>>
 
</tt /ii<cd> /optional<</sl directory>>>
 
Tiedostohierarkiassa liikkuminen tapahtuu komennolla </tt cd>
(/ii<change directory>). Eksytty{si liian kauas kotoa voit sanoa
pelk{st{{n </tt cd>, jolloin p{{set takaisin /ii<kotihakemisto>on.
</tt cd ..> siirtyy hakemistohierarkiassa seuraavaksi ylemm{lle
tasolle ja </tt cd ali> vie nykyhakemiston alihakemistoon </tt ali>.

</tt /ii<pwd>>
 
Toinen apuneuvo eksyksiin joutuneelle on komento </tt pwd>
(print working directory), joka kertoo /ii<nykyhakemisto>n
nimen.  (Huomaa, ett{ </sc/ii<ms-dos>>-k{ytt|j{rjestelm{ss{ t{t{
vastaa pelkk{ komento </tt cd> ilman parametreja, joka
</sc unix>issa puolestaan vie kotihakemistoon!)

</tt /ii<mkdir> /sl directory>
 
Luodaan nykyhakemiston alle alihakemisto </sl directory>.
 
</tt /ii<rmdir> /sl directory>
 
Poistetaan alihakemisto. Hakemiston on oltava t{ysin tyhj{, jotta se
voitaisiin tuhota. (Tyhj{ss{ hakemistossa on j{ljell{ vain
normaalissa hakemistolistassa n{kym{tt|m{t tiedostot </tt .> ja </tt
..>, jotka ovat linkkej{ hakemistoon itseens{ ja sen
{itihakemistoon, ja joita ei voi hakemistosta poistaa.)

 
/subsection</ii<Tiedostokomentoja>>
 
</tt /ii<ls> /optional<</sl optio>>/iter /optional<</sl file>>>
 
Komento </tt ls> antaa /ii<tiedostoluettelo>n.  Normaalisti
tulostuu vain lista tiedostojen nimist{, jokainen omalle
rivilleen.  Komennoilla </tt ls -x> ja </tt ls -C> saa
listan useammalle palstalle (kuten </sc vms>:n 
</tt dir>:ll{).  Sunin </sc unix>issa tiedostolista tulee
oletuksena useammalle palstalle. 

Komento </tt ls -l> antaa perusteellisemman luettelon, josta
n{kyv{t mm. tiedostojen suojaukset, koot jne.
Seuraavassa on esimerkki komennon </tt ls -l> tulostuksesta:
 
</copymode
total 59
-rwx------   1 hkarttun csc     211560 May 12 10:24 a.out
drwx------   2 hkarttun csc        352 May 12 09:06 bench
drwx------   2 hkarttun csc        160 Apr 28 07:42 chaos
-rw-r--r--   1 hkarttun csc        634 May 12 10:16 c2.f
drwx------   2 hkarttun csc        992 Apr 24 07:38 exerc
drwx------   2 hkarttun csc        608 May 31 14:27 test
>
 
Ensimm{isell{ sarakkeella oleva </tt -> tarkoittaa, ett{
kysymyksess{ on tavallinen tiedosto; </tt d> tarkoittaa
hakemistoa. 
 
Seuraavat yhdeks{n merkki{ kertovat /ii<tiedoston suojaukset>, 
joita k{sitell{{n erikseen luvussa /ref<8.7>.

Suojaukset ovat kolmitasoisia: ensimm{inen kolmen merkin
ryhm{ kertoo, mit{ tiedostojen /ii<omistaja> (user) saa
tiedostoilleen tehd{, seuraavat kolme merkki{ ilmoittavat
/ii<ryhm{>n (group) oikeuden ja kolme viimeist{ muun
maailman (others) oikeudet.  Kirjaimet tarkoittavat
seuraavia asioita: </tt r> = oikeus lukea tiedosto, </tt w>
= oikeus kirjoittaa tiedostoon, </tt x> = oikeus suorittaa
tiedosto, jolloin se on joko k{{nnetty ja linkitetty ohjelma
tai </sc unix>in komentoja sis{lt{v{ komentotiedosto (script). 
 
Suojauksia seuraava numero ilmoittaa, kuinka monta </sl /ii<linkki>{>
tiedostoon osoittaa. 
 
Seuraavat kent{t ilmoittavat tiedoston omistajan, ryhm{n, koon
tavuina, viimeisen muutosajan ja tiedoston nimen.
 
Edellisess{ listassa eiv{t n{y tiedostot, joiden nimi
alkaa pisteell{ (kuten </tt .profile>). Komennolla
</tt ls -al> saa nekin n{kyviin. Pisteell{ alkavat "/ii<piilotiedosto>t"
ovat yleens{ systeemin hallintaan liittyvi{ alustustiedostoja.
 
 
</tt /ii<cat> /sl file>
 
/iii<tiedoston tulostaminen>
Komento </tt cat> (catenate) listaa tiedoston, kuten </sc vms>:n tai
</sc dos>:n </tt type>. Sit{ voidaan my|s
k{ytt{{ tiedostojen luontiin, yhdistelyyn yms. Siit{ tarkemmin
hieman my|hemmin.
 
</tt /ii<more> /sl file>
 
Listaa tiedoston </sl file> kuvaruudullinen kerrallaan
(samaan tapaan kuin </sc vms>:n komento </tt type//page>
tai </sc dos>:n </tt more /lt></sl file>).
Tavallisesti seuraavan sivun saa painamalla v{lily|nti{.
Jos tietoliikenneohjelma toimii rivimoodissa, kuten Station-ohjelmisto, 
on lis{ksi viel{ painettava /boxed<Enter>i{.
 
</tt /ii<tail>> /optional</sl<n>> </sl file>

Toinen eritt{in hy|dyllinen listauskomento on </tt tail>,
joka listaa tiedoston lopun. Esimerkiksi komento
</tt tail -50 loki> tulostaa tiedoston </tt loki>
50 viimeist{ rivi{. Komento </tt tail +100 loki> puolestaan 
listaa tiedoston rivilt{ 100 alkaen loppuun saakka.
Ellei rivien m{{r{{ ilmoiteta, tulostetaan 10 viimeist{ rivi{.


/iii<tiedoston kopiointi>
</tt /ii<cp> /sl infile /sl outfile>/nl
</tt cp /sl infile /sl dir>
 
Kopioidaan tiedosto </sl infile> tiedostoksi </sl outfile>
tai hakemistoon </sl dir>.
 
/iii<tiedoston nime{minen>
</tt /ii<mv> /sl old /sl new>/nl
</tt mv /sl old /sl dir>
 
Muutetaan tiedoston </sl old> nimeksi </sl new> tai siirret{{n
se hakemistoon </sl dir>.
 
/iii<tiedoston poistaminen>
</tt /ii<rm> /sl file>
 
H{vitet{{n tiedosto </sl file>. Ole varovainen, jos k{yt{t
tiedostonimess{ jokerimerkkej{. Kannattaa ensin katsoa
</tt ls> -komennolla, miten jokerit tulkitaan ja vasta sitten
k{ytt{{ </tt rm>-komentoa. Voit my|s k{ytt{{ optiota </tt -i>,
jolloin jokaisesta tiedostosta kysyt{{n erikseen, saako
sen tuhota.
  
Huomaa, ett{ tiedoston poistaminen on riippumaton tiedoston itsens{
suojauksista: sit{ varten tarvitaan vain kirjoitusoikeus siihen
hakemistoon, jossa tiedosto on.  Komento </tt rm> tosin kysyy
k{ytt{j{lt{, haluaako t{m{ todella poistaa kirjoitussuojatun
tiedoston.


/section</ii<Tiedostojen suojaukset>>

Tiedostojen suojaukset ovat </sc unix>issa samantapaiset 
kuin </sc vms>:ss{.

Jokaisella tiedostolla on kolme eri oikeusbitti{ kolmea eri
k{ytt{j{ryhm{{ varten, jotka yhdess{ osoittavat mit{ kukin
k{ytt{j{ voi kyseiselle tiedostolle tehd{. 

K{ytt{j{ryhm{t ovat </sl /ii<omistaja>>, </sl /ii<ryhm{>> ja 
</sl /ii<muut>>.  Ja oikeudet ovat </sl /ii<lukuoikeus>>, 
</sl /ii<kirjoitusoikeus>> ja </sl /ii<suoritusoikeus>>. 

K{ytt{j{ voi kuulua useampaan ryhm{{n.

/iii<komentotiedoston suojaukset>
Lukuoikeus sallii tiedoston lukemisen (tai kopioinnin),
kirjoitusoikeus tiedostoon kirjoittamisen. Suoritusoikeus oikeuttaa
vain suorittamaan kyseisen tiedoston (ohjelman tai /ii<komentotiedosto>n,
scriptin), mutta ei muuttamaan tai lukemaan sit{. Komentotiedoston 
suorittamiseen tarvitaan kuitenkin my|s lukuoikeus kyseiseen tiedostoon.

/ii<Superuser>illa on aina kaikki oikeudet kaikkiin tiedostoihin,
riippumatta siit{ kuka tiedoston omistaa.


/subsection</ii<Hakemistojen suojaukset>>

Hakemistojen kohdalla suojausbittien merkitys on hieman erilainen.

Lukuoikeus hakemistoon sallii hakemiston sis{llyksen listaamisen eli
hakemistolistan tulostamisen.  Se tarkoittaa siis sit{, ett{
hakemistolle saa sanoa </tt ls>.

Kirjoitusoikeus hakemistoon tarkoittaa, ett{ hakemistoa saa muuttaa
eli siihen saa lis{t{ tai sielt{ saa poistaa tiedostoja tai siell{
olevia tiedostoja voi muuttaa. (Hakemistoon itseens{, eli siihen
tiedostoon, jossa hakemiston tiedostojen lista on, ei voi yleens{
"suoraan" kirjoittaa.)

Erityisesti on huomattava, ett{ tiedoston poistaminen on
riippumaton tiedoston itsens{ suojauksista: poistamista
varten tarvitaan vain kirjoitusoikeus siihen hakemistoon,
jossa tiedosto on, ei v{ltt{m{tt{ kirjoitusoikeutta itse
tiedostoon! Komento </tt rm> tosin kysyy k{ytt{j{lt{,
haluaako t{m{ todella poistaa kirjoitussuojatun tiedoston. 
[l{ siis koskaan anna tarpeettomasti muille
kirjoitusoikeutta omiin hakemistoihisi. 

Suoritusoikeus hakemistoon oikeuttaa k{ytt{m{{n hakemistosta l|ytyv{{
tiedostoa (jos sen suojaukset k{yt|n sallivat), mik{li sen tiet{{
olevan kyseisess{ hakemistossa, mutta tiedostoja ei voi etsi{
komennolla </tt ls>.  Hakemistoon saa my|s siirty{ komennolla </tt
cd>.

Jotta tiedostoon p{{sisi k{siksi, on tiedoston omien suojausten
lis{ksi koko polussa esiintyvien hakemistojen suojausten sallittava
t{m{. Oikeus johonkin tiedostoon edellytt{{ siis, ett{ kaikkiin
kyseisen tiedoston t{ydellisess{ nimess{ esiintyviin hakemistoihin on
v{hint{{n suoritusoikeus. T{ll|in tiedostoa voi k{ytt{{, jos tiet{{
sen (t{ydellisen) nimen.


/subsection<Tiedoston /ii<suojauksiin liittyv{t komennot>>

/ii<Tiedostojen suojaukset> n{kee komennolla </tt ls -l>, ja niit{ voi
muuttaa komennolla </tt /ii<chmod>>. Oletussuojaukset n{kee komennolla
</tt /ii<umask>>, ja niit{ voi omalta kohdaltaan muuttaa samoin komennolla
</tt umask>.

Komennolla </tt ls -l> saa listan tiedostoista, jossa kullakin rivill{ on 
yhden tiedoston tiedot:

</copymode
finsun/% ls -l
total 19
-rw-------  1 serimaa     11608 Feb 19 20:40 devices
-rw-------  1 serimaa       322 Feb 16 20:41 mbox
-rw-r--r--  1 serimaa      3550 Feb 15 10:33 tiedote.txt
>

Aivan alussa on kymmenen merkin mittainen kentt{, jossa on

</copymode
      drwxrwxrwx
      0123456789
>

T{ss{ 0:s merkki on </tt d>, jos tiedosto on hakemisto
(directory), merkit 1--3 kertovat omistajan, merkit 4--6
ryhm{n ja merkit 7--9 muiden oikeudet.  Oikeuksia ei ole,
mik{li kyseisell{ paikalla on viiva eli miinusmerkki /hbox<</tt ->.>
Oikeudet ovat j{rjestyksess{ </tt rwx>, eli luku-,
kirjoitus- ja suoritusoikeus.  Erikoistapauksissa n{iss{
kentiss{ voi my|s olla muitakin kirjaimia, joilla kuitenkaan
yleens{ silloin ei ole yhteytt{ suojauksiin. 
 
</tt /ii<chmod> /sl protection file>
 
Muutetaan tiedoston </sl file> suojauksia. Havainnollisin tapa
tehd{ t{m{ on ilmoittaa suojaus kolmen merkin yhdistelm{n{.
Ensimm{inen kertoo, ket{ asia koskee: </tt u> omistaja (user),
</tt g> ryhm{ (group) tai </tt o> muut (others). Jos t{m{
tieto puuttuu, koskee asia kaikkia kolmea. Seuraava merkki
ilmoittaa, annetaanko oikeus (</tt +>) vai otetaanko se pois (</tt ->).
Kolmas merkki ilmoittaa vihdoin, mit{ oikeutta muutetaan:
</tt r> lukuoikeus (read), </tt w> kirjoitusoikeus (write) vai
</tt x> suoritusoikeus (execute). 

Jos esimerkiksi kirjoitat
/ii<komentotiedosto>n, sill{ ei normaalisti ole suoritusoikeutta,
vaan sellainen on sille annettava esimerkiksi sanomalla
 
</copymode
      chmod u+x scripti
>
 
T{m{n j{lkeen voit suorittaa tiedoston </tt scripti> yksinkertaisesti
kirjoittamalla sen nimen. Komentotiedoston suorittamiseksi 
tarvitaan (outoa kyll{; t{m{ poikkeaa mm. </sc vms>:st{) 
my|s lukuoikeus, mutta t{m{ sill{ todenn{k|isesti
on oletussuojausten perusteella.
Jos sanot </tt chmod +rx scripti>, annat
my|s kaikille muille oikeuden lukea ja suorittaa tiedoston.
 
Suojausbitit voi my|s ilmoittaa oktaalinumeroilla, siten ett{ 
lukuoikeus = 4, kirjoitusoikeus = 2 ja suoritusoikeus = 1.
Esimerkiksi seuraava komento antaa omistajalle kaikki oikeudet
ja muille ei mit{{n:

</copymode
      chmod 700 scripti
>

/subsection<Tiedostojen /ii<oletussuojaukset>>

Supertietokoneen k{ytt{j{t on jaettu ryhmiin siten, ett{ jokainen
/ii<projekti>, josta on t{ytetty erillinen hakemus, muodostaa oman
ryhm{n. Ryhm{n nimi on yleens{ sama kuin ryhm{n vet{j{n k{ytt{j{tunnus.
Sama k{ytt{j{ voi kuulua useaan ryhm{{n.

Tiedostot on suojattu siten, ett{ vain k{ytt{j{ll{ on oikeus niihin.
Oletussuojauksia voi muuttaa siten, ett{ antaa my|s ryhm{n muille
j{senille oikeudet tiedostoihin.

Oletussuojaukset m{{rittelee komento </tt /ii<umask>>. Komennolla
kerrotaan (oktaaliluvuilla) mitk{ oikeudet kultakin taholta poistetaan.
Oletussuojaukset ovat </tt 077> eli k{ytt{j{ll{ on kaikki
oikeudet (=0 eli mit{{n ei oteta pois), muilla ei mit{{n oikeuksia
(= 7 eli kaikki oikeudet poistettu). 
T{ss{ bitit ovat siis juuri p{invastoin kuin </tt chmod>-komennossa.

Projekteilla, jotka haluavat jakaa tiedostot, on hyv{
m{{ritell{ oletussuojaukseksi </tt 027>, jolloin muilta
ryhm{n j{senilt{ poistetaan kirjoitusoikeus mutta annetaan
luku- ja suoritusoikeus.  Komennon </tt umask 027> voi
sijoittaa </tt /ii<.profile>> -tiedostoon, jolloin se on voimassa
aina. 


/section<K{yt|ss{ olevan tiedostotilan arviointi>

Tiedostojen varaaman /ii<levytilan arviointi>in voi k{ytt{{
kahta komentoa: </tt df> ja </tt du>. 

Komento </tt /ii<df>> n{ytt{{ kaikkien tiedostoj{rjestelmien vapaan tilan,
esimerkiksi:

</beginverbatim
/comm     (/dev/dsk/comm):        128039 free ( 99.6%)
/fmi      (/dev/dsk/fmi):         265640 free ( 68.9%)
/univ2    (/dev/dsk/univ2):       334729 free ( 86.8%)
/univ1    (/dev/dsk/univ1):        81539 free ( 21.1%)
/csc      (/dev/dsk/csc):          53087 free ( 12.8%)
/vtt      (/dev/dsk/vtt):         137593 free ( 53.5%)
/usr/spool(/dev/dsk/spool):        65798 free ( 51.2%)
/usr/adm  (/dev/dsk/adm):          68580 free ( 53.3%)
/usr      (/dev/dsk/usr):          39891 free ( 21.9%)
/tmp      (/dev/dsk/tmp):        1277919 free ( 81.3%)
/drop     (/dev/dsk/drop):        118529 free ( 92.2%)
/         (/dev/dsk/root):          6327 free ( 13.9%)
/endverbatim>

/ii<Vapaa tila> ilmoitetaan /ii<levylohko>issa eli 512 sanan
eli 4096 tavun yksik|iss{.  Kaikki samassa
/ii<tiedostoj{rjestelm{>ss{ olevat k{ytt{j{t kilpailevat
vapaana olevasta levytilasta.  Kun vapaa tila on alle 10 /%,
saavat tiedostoj{rjestelm{n k{ytt{j{t siit{ erillisen
ilmoituksen sis{{nkirjoittauduttaessa.  T{ll|in on itse
kunkin syyt{ siivota turhat tiedostonsa pois. 

Kun hakemistosta ottaa laajan tiedostolistan komennolla
</tt ls -l>, tulee ensimm{isen{ listaan luku, joka kertoo
hakemiston tiedostojen varaaman levytilan levylohkoina.
T{h{n lukuun ei ole laskettu mukaan alihakemistoissa olevien
tiedostojen varaamaa levytilaa.

Kaikkien tiedostojen varaaman levytilan voi listata komennolla
</tt /ii<du>>. Sen haittapuoli on, ett{ se k{y kaikki alihakemistot
l{pi ja listaa jokaisen tiedoston erikseen. Komennosta onkin
mukava k{ytt{{ muotoa 

</copymode 
      du -s *
> 

jolla saa jokaisesta
nykyhakemiston tiedostosta ja hakemistosta niiden varaaman tilan
kokonaism{{r{n. Haittapuoli on, ett{ komennon suoritus voi kest{{
yll{tt{v{n kauan.

/page
/section<Standardi-I//O>

/subsection</ii<Standarditiedostot>>
 
</sc Unix>issa kuhunkin komentoon liittyy kolme tiedostoa: 
</tt/ii<stdin>>, josta luetaan sy|tt|tietoja, </tt/ii<stdout>>, johon
tulostetaan, ja </tt/ii<stderr>>, jonne virheilmoitukset
tulostuvat.  Interaktiivisessa ty|skentelyss{ n{m{ kaikki
kolme tiedostoa viittaavat yleens{ yhteen ja samaan
p{{tteeseen. 

</sc Unix>issa suurin osa komennoista on "suotimia" eli 
</sl/ii<filttereit{>>.  Filtterit k{sittelev{t tyypillisesti teksti{,
ja lukevat k{sittelem{ns{ tekstin /ii<perussy|tt|tiedosto>sta
</tt stdin> ja tulostavat k{sitellyn tekstin
/ii<perustulostustiedosto>on </tt stdout>. 

Muissakin ohjelmissa k{ytet{{n n{it{ tiedostoja samoin. 
T{m{ k{yt{nt| on suositeltava my|s omien ohjelmien
kirjoittajille, koska t{ll|in n{m{kin ohjelmat toimivat
johdonmukaisesti samaan tapaan kuin </sc unix>in omatkin komennot. 
 

/subsection</ii<Uudelleenohjaus>>

Er{s </sc unix>in k{tevimpi{ piirteit{ on joustava mahdollisuus muutella
sit{, mihin n{m{ standarditiedostot todellisuudessa viittaavat.
T{h{n uudelleenohjaukseen (/ii<redirection>) k{ytet{{n symboleita
</tt /ii</gt>>, </tt /ii</lt>>, </tt /ii</gt/gt>> ja </tt/ii</lt/lt>>.

Jokaisen filtterikomennon sy|t|n ja tulostuksen voi helposti
ohjata mihin tiedostoon (tai laitteelle, koska laitteetkin
ovat tiedostoja) tahansa.  Uudelleenohjaus, samoin kuin
jokerimerkkien laajennus, on komentotulkin "palvelus", itse
komennon ei tarvitse tehd{ asiassa mit{{n eik{ se yleens{
edes tied{ asiasta mit{{n. 

/iii<tulostuksen uudelleenohjaus>
Tulostus (</tt stdout>) voidaan ohjata tiedostoon </sl file>
liitt{m{ll{ komennon per{{n </tt /gt /sl file>. Esimerkiksi
tiedostoluettelon voi tallettaa tiedostoon </tt myfiles>
sanomalla
 
</copymode
      ls </gt>myfiles
>
 
Mik{li tiedosto </tt myfiles> oli olemassa jo ennest{{n,
tuhoutuu vanha versio ja korvautuu uudella tiedostoluettelolla.

Jos </tt/gt>:n sijasta k{ytet{{n operaattoria </tt/gt/gt>,
ei mahdollisesti jo olemassaoleva tiedosto h{vi{k{{n, vaan
tulostus liitet{{n (append) ilmoitetun tiedoston per{{n.

Esimerkiksi nykyhakemiston ja sen
{itihakemiston yhdistetyn hakemistolistan saa komennoilla

</copymode
      ls </gt>myfiles
      ls .. </gt/gt>myfiles
>

Edelleen seuraavat komennot liitt{v{t tiedostot
</tt a> ja </tt b> per{kk{in tiedostoksi </tt c>:
 
</copymode
      cat a </gt>c
      cat b </gt/gt>c
>

tai lyhyemmin katenoimalla tiedostot suoraan

</copymode
      cat a b </gt>c
>

/iii<sy|t|n uudelleenohjaus>
Sy|tt|tiedot voidaan lukea tiedostosta </sl file>
sanomalla </tt/lt/sl file>. 
Jos ohjelma </tt prog> tavallisesti pumppaa kaipaamansa
tiedot p{{tteell{ istuvalta k{ytt{j{lt{, se saadaan
lukemaan ne tiedostosta </tt infile> ja
tallettamaan tulostuksensa tiedostoon </tt outfile>
komentamalla
 
</copymode
      prog </lt>infile </gt>outfile
>
 
Esimerkki: Seuraava komento j{rjest{{ tiedoston </tt input.file> rivit ja
tulostaa ne tiedostoon </tt sorted.file>:

</copymode
      sort /lt<input.file> /gt<sorted.file>
>

/iii<virheilmoitusten uudelleenohjaus>
Virheilmoitukset voidaan my|s ohjata haluttuun tiedostoon.
Esimerkiksi

</copymode
      prog 2/gt<tumbolia>
>

l{hett{{ ohjelman </tt prog> </tt stderr>iin kirjoittamat
ilmoitukset tiedostoon </tt tumbolia>.


/subsection</ii<Here document>>

Sy|tt| ohjataan siis tapahtuvaksi tiedostosta kirjoittamalla
tiedoston nimen eteen komentoriville merkki </tt /lt>, ja
tulostus ohjataan tiedostoon kirjoittamalla tulostiedoston
nimen eteen merkki </tt /gt>.  Jos halutaan tulostaa jo
olemassaolevan tiedoston per{{n (append), kirjoitetaan
tulostustiedoston eteen kaksi </tt /gt> merkki{. 
 
Nyt tietenkin her{{ kysymys, mit{ </tt/lt/lt> tekee?
"Append"-tyyppinen operaatio ei ole oikein j{rkev{
sy|tt|tiedostoille, joten </tt/lt/lt>:lle onkin varattu toinen
merkitys. Sit{ tarvitaan esimerkiksi er{t|iss{, joissa ohjelman
sy|tt|aineisto halutaan sis{llytt{{ ty|tiedostoon, eli halutaan
lukea sy|tt|tiedot "ajovirrasta" (script-tiedostosta).

Sy|tt|virrassa olevasta datasta voidaan muodostaa ns. </sl here
document> seuraavasti:

</copymode
      .//prog </lt/lt>loppuu
      t{m{
      kaikki on ohjelman prog
      sy|tt|aineistoa
      kunnes l|ytyy sana loppuu
      loppuu
>
 
Here document muodostetaan siis kirjoittamalla kaksi </tt
/lt>-merkki{, ja sen per{{n valinnainen jono merkkej{ (t{ss{ </tt
loppuu>). T{m{ ilmoittaa, ett{ </tt prog>in </tt stdin>-tiedostoon
tarkoitettu teksti luetaan sy|tt|virrasta, kunnes vastaan tulee rivi,
jolla on pelk{st{{n sana </tt loppuu>. Sy|tt|tiedosto koostuu
kaikista riveist{ t{st{ komentorivista alkaen, kunnes l|ydet{{n rivi,
jossa esiintyy pelk{st{{n edell{ valittu aineiston
p{{tt{v{ merkkijono (t{ss{ </tt loppuu>), jonka on alettava heti
ensimm{iselt{ sarakkeelta, joten datan joukossa aiemmin esiintynyt sana </tt
loppuu> ei katkaise here documenttia. Sanan </tt loppuu> tilalle
voi tietenkin valita mink{ tahansa merkkijonon.

N{in m{{ritellyss{ here documentissa suoritetaan datassa
esiintyvien muuttujien ja lainausmerkeiss{ olevien
komentojen evaluointi (ks. /ref<9.3>). T{m{ voidaan est{{
lainaamalla lopetussymboli. Siis esimerkiksi

</copymode
      cat </gt>tmpfile </lt/lt>'loppuu'
      ...
      loppuu
>

kopioi kaiken tekstin sellaisenaan, mutta

</copymode
      cat </gt>tmpfile </lt/lt>loppuu
      `who`
      loppuu
>

tulostaakin tiedostoon </tt tmpfile> luettelon k{ytt{jist{.

Varoitus: "here document"-piirre est{{ /ii<jatkoaloituksen>
(/ii<restart>) supertietokoneella.  </sc Unicos>-j{rjestelm{
tekee "/ii<checkpoint>in" --- eli tallettaa kesken olevan
ty|n tilan --- automaattisesti jokaisessa hallitussa
systeemin alasajossa, ja "bootin" j{lkeen aloittaa ty|n
uudelleen automaattisesti.  T{m{ kuitenkin jostain syyst{
estyy, jos jatkoaloitusta suoritettaessa ollaan viel{ "here
document" -kohdassa. 
 
Suositeltavampi tapa Crayn er{t|iss{ on tallettaa aineisto
esimerkiksi </tt cat>-komennolla tiedostoon (ajon alussa)
ja lukea se sitten sielt{:
 
</copymode
      cat </gt>tmpfile </lt/lt>loppuu
      t{m{
      kaikki on ohjelman prog
      sy|tt|aineistoa
      kunnes l|ytyy sana loppuu
      loppuu
      .//prog </lt>tmpfile
      rm tmpfile
>

T{ll|in tiedoston </tt tmpfile> luominen on suhteellisen nopea
toimenpide, joten checkpoint ei todenn{k|isesti tapahdu juuri
silloin, kun ollaan t{ss{ kohdassa. Ja vaikka niin k{visikin, ja
jatkoaloitus ep{onnistuisi, ty| aloittaa kuitenkin alusta uudelleen,
ja juuri mit{{n ei ole menetetty, koska muutoinkin oltiin vasta ty|n
alussa.

</sc Fortran>-ohjelmia varten voidaan sy|tt|- ja tulostustiedostoja
liitt{{ my|s ohjelman k{ytt{miin tiedosto/ii<kanavanumero>ihin 
</tt /ii<assign>>-komennolla (vain Crayss{).
T{st{ enemm{n luvussa /ref<15.2>.


/subsection</ii<Putket>>
 
Sy|tt|- ja tulostusvirran ohjaukseen liittyy my|s </sl
putken> (/ii<pipe>) k{site.  Putki, jota komennoissa
merkit{{n pystyviivalla (/ii<</tt/char'174>>), on
periaatteessa tiedosto, johon yhden komennon tulostus (</tt
stdout>) ohjataan ja josta toinen komento lukee
sy|tt|tietonsa (</tt stdin>).  T{t{ "putkitiedostoa" ei vain
kirjoiteta (yleens{ koskaan) levylle, vaan se sijaitsee
muistissa kahden prosessin v{lisen{ kommunikaatiokanavana:
toinen tuottaa putkeen tavaraa, ja toinen kuluttaa sit{. 
Putki on siis oikeastaan </sl /ii<jono>> eli </sl fifo>
(first-in-first-out). 

Esimerkiksi hakemistossa olevien tiedostojen m{{r{n saa
k{tev{sti selville komennolla
 
</copymode
      ls /char'174 wc -l
>
 
Komento </tt ls> l{hett{{ t{ss{ tiedostolistan putkeen,
josta komento </tt wc> (word count) huuhtelee sen alas. Optio </tt -l>
(lines) tarkoittaa, ett{ </tt wc>:n halutaan laskevan rivej{.
 
Jos odotettavissa on enemm{n kuin kuvaruudullinen tulostusta,
sen voi l{hett{{ putkitse </tt more>lle, jolloin sen
voi lukea kaikessa rauhassa sivu kerrallaan:
 
</copymode
      ls -l /char'174 more
>

Putket ovat yksi voimakkaimmista </sc unix>-k{ytt|j{rjestelm{n 
piirteist{, joiden er{s etu on,
ett{ k{ytt|j{rjestelm{ huolehtii niiden luomisesta,
k{sittelemisest{ ja h{vitt{misest{ automaattisesti, ilman
ett{ niit{ k{ytt{v{t ohjelmat edes tiet{v{t niiden
olemassaolosta.  N{m{ ohjelmat luulevat lukevansa ja
kirjoittavansa standarditiedostoihin </tt stdin> ja </tt stdout>. 

Ja mik{ parasta, kyseiset ohjelmat tuottavat ja kuluttavat putken sis{lt|{
samanaikaisesti rinnakkain, mutta toinen toisistaan riippumatta 
(asynkronisesti). Ainoastaan jos tuottaja j{{ j{lkeen kuluttajasta, joutuu
kuluttaja odottamaan putken t{yttymist{.

Jotta ohjelmat voitaisiin t{ll{ tavoin liitt{{ toisiinsa, ne tulee ohjelmoida 
siten, ett{ ne p{{s{{nt|isesti lukevat tiedostosta </tt stdin> ja kirjoittavat
tiedostoon </tt stdout>. Ja jotta kaikenlaiset ohjelmien ilmoitukset eiv{t 
h{iritsisi putkeen tuotettavaa tietoa, ohjelmat useimmiten ovat kryptisen 
hiljaa tekemisist{{n eiv{tk{ juuri l|rp|ttele turhia. Jos haluat
lis{t{ omaan ohjelmaasi ylim{{r{isi{ ilmoituksia, voit toki 
ohjata ne tiedostoon </tt stderr>.


/subsection</ii<Filtterit> ja /ii<ty|kalut>>

Tyypillisesti putken p{iss{ k{ytet{{n standarditiedostojen uudelleenohjausta
todellisiin levytiedostoihin, ja putkeen liitet{{n useita pieni{ t{llaisia 
</sl filttereit{> eli ohjelmia, jotka "suodattavat" sy|tteeksi saamansa 
datan tulosteekseen, joka sitten jatkaa valumista putken liukuhihnassa 
seuraavalle filtterille. K{sitelt{v{ tieto on usein tekstimuotoista.

Erilaisten filtteriohjelmien helppo (ja tehokas!)
liitt{minen toisiinsa putkilla on johtanut </sc unix>ille
ominaiseen </sl ty|kaluajatteluun>: sen sijaan ett{
laadittaisiin mammuttiohjelmia, jotka osaavat tehd{ "kaiken"
(ja toisistaan riippumattomasti ja toisiinsa
sopeutumattomasti, "erilailla"), ohjelmoidaankin kokonainen
joukko pieni{, helposti muutettavia ja yll{pidett{vi{
ty|kaluja (tools), joista kukin osaa tehd{ yhden asian,
mutta sen sitten tosi hyvin.  N{in </sc unix>ista on tullut
tehokas ja voimakas k{ytt|j{rjestelm{ ilman ett{ se olisi
paisunut liian suureksi.  "Small is beautiful."
 

/section</ii<Inode>>

/ii<Tiedosto> koostuu monesta "osasta": Tiedostolla on nimi ja sis{lt|
ja sen lis{ksi siihen kuuluu monenlaista "hallinnollista" tietoa,
kuten tiedoston pituus tavuina, suojaukset, tarkka sijainti levyll{,
luonti-, muuttamis- ja viimeinen k{ytt|aika jne. T{m{ hallinnollinen
tieto on ns </sl information node>:ssa, eli lyhyesti </sl inodessa>.

Tarkasti ottaen hakemistossa on vain tiedoston nimi ja osoitin (eli
</sl /ii<linkki>>) tiedostoa kuvaavaan inodeen, jonka kautta tiedoston
sis{lt||n p{{st{{n k{siksi.  T{m{ sallii sen, ett{ sama fyysinen
tiedosto (eli inode) voi olla kahdessa tai useammassa hakemistossa ja
viel{p{ erinimisen{. T{llaiset linkit muuttavat tiedostoj{rjestelm{{
siten, ettei se itse asiassa en{{ olekaan puu.  Inodessa on viel{
muun informaation lis{ksi laskuri, joka pit{{ kirjaa siit{, kuinka
monta linkki{ tiedostoon on. Tiedosto poistetaan j{rjestelm{st{, kun
t{m{ laskuri laskee arvoon 0.

Uusi linkki luodaan komennolla </tt /ii<ln>>, ja se poistetaan komennolla
</tt /ii<rm>>.

/iii<kova linkki>
/iii<pehme{ linkki>
Linkkej{ on itse asiassa kahta eri lajia: </sl kovia> ja </sl
pehmeit{>.  Kova linkki on osoitin inodeen, kun taas pehme{ linkki on
oleellisesti sen tiedoston nimi, johon pehme{ linkki halutaan
osoittaa. Crayss{ ei ole pehmeit{ linkkej{. Kovia linkkej{ ei voi
osoittaa tiedostosysteemist{ toiseen (sill{ kussakin
tiedostosysteemiss{ on ihan ikioma inode-taulukko).


/section</ii<Laitteet>>

Er{s </sc unix>-k{ytt|j{rjestelm{n eleganteista ideoista on pit{{
oheislaitteita (levyasemat, nauha-asemat, tulostimet) ja
p{{tteit{ (tai oikeammin niiden laiteohjaimia, device
drivers) tiedostoina, ns.  /ii<erikoistiedosto>ina.  Ne
sijaitsevat yleens{ hakemistossa </tt/ii<//dev>>.  N{ist{
laitetiedostoista aluksi t{rkein on p{{te, jota vastaavan
tiedoston n{kee komennolla </tt /ii<tty>>. 

Laitetiedostoja k{sitell{{n </sc unix>issa kuten tavallisia
tiedostoja.  Esimerkiksi komento

</copymode
      cp //dev//ttyp2 roska.1
>

kopioi p{{tteen (eli p{{tteelt{ naputellut merkit ja rivit aina
tiedoston loppumerkkiin </tt ctrl-D> asti) tiedostoon </tt
roska.1>.


/section<Tiedostojen sijoitus>
 
Levytiedostoja voi tehd{ ja s{ilytt{{ periaatteessa kolmessa paikassa;
kotihakemistossa, ty|alueella tai tilap{istiedostoalueella. Lis{ksi
on eri tapoja tallettaa tiedostoja magneettinauhoille.
 
</bf Pysyv{t tiedostot>
 
/ii<Kotihakemisto>ssa (</tt/ii</$HOME>>) olevat tiedostot ovat
pysyvi{ ja niist{ otetaan s{{nn|llisesti /ii<varmuuskopio>t. 
Kotihakemistoissa otetaan k{ytt||n levytilan
kiinti|intij{rjestelm{.  Kiinti|inniss{ noudatetaan
seuraavaa periaatetta:
/iii<levykiinti”>

/beginitems
 
/item<$/bullet$> kotihakemistossa voi oletuksen mukaan s{ilytt{{ tiedostoja
10 megatavua,
 
/item<$/bullet$> k{ytt{j{n pyynn|st{ kiinti| voidaan nostaa 50 megatavuun,
 
/item<$/bullet$> yli 50 megatavun kiint|it{kin annetaan, jos siihen on
perusteltu syy.

/enditems 
 
</bf/ii<Tilap{istiedosto>t>
 
Kaikkien k{ytt{jien k{ytett{viss{ on iso
tilap{istiedostoalue </tt/ii<//tmp>>.  Alueen koko on t{ll{
hetkell{ l{hes 7 gigatavua ja sille menev{ levysiirr{nt{ on
puskuroitu nopean /ii<SSD>-levyn kautta.  Kaikkien ohjelmien,
jotka tekev{t paljon levysiirr{nt{{, kannattaa k{ytt{{ t{t{
aluetta.  Puskuroinnin vaikutuksen huomaa varmasti ohjelman
lyhentyneen{ l{pimenoaikana. 
 
Tilap{istiedostot s{ilyv{t yhden vuorokauden siit{ kun ne on
luotu tai kun niit{ on viimeksi k{ytetty.  Lis{ksi on
mahdollisuus tehd{ ajoaikaisia tiedostoja. 
 
Suoraan hakemiston </tt //tmp> alle tehdyt tiedostot
s{ilyv{t yhden vuorokauden.  Hakemistoon </tt //tmp> on
kaikilla k{ytt{jill{ kirjoitusoikeus.  Sen alle on hyv{
tehd{ omia alihakemistoja.  Alihakemiston voi tietenkin
nimet{ miten haluaa, seuraavia tapoja kuitenkin
suositellaan.  Jos samaa hakemistoa haluaa k{ytt{{ usein,
sen nimi tulisi olla sama kuin k{ytt{j{tunnus, esimerkiksi
</tt //tmp//lounamaa>.  Jos hakemistoa on tarkoitus k{ytt{{
vain yhden er{ajon ajan, sen voi tehd{ er{ajon alussa
esimerkiksi seuraavasti:
 
</copymode
      mkdir //tmp//p/$/$
      cd //tmp//p/$/$
>
 
Nimess{ oleva </tt/ii</$/$>> on shell-muuttuja, jonka arvoksi tulee
prosessin numero. Muuttuja on voimassa koko er{ty|n ajan.
Nimest{ tulee n{in yksik{sitteinen eik{ ole vaaraa,
ett{ joku toinen k{ytt{j{ tekisi saman nimisen hakemiston. 
 
 
</bf/ii<Ajoaikaiset tilap{istiedostot>>
 
K{ytt|j{rjestelm{ss{ on varattu k{ytt||n muuttuja </tt/ii</$TMPDIR>>
aidosti tilap{isi{ tiedostoja varten.
Kun ty| alkaa, k{ytt|j{rjestelm{ tekee hakemiston, jonka nimi
interaktiivisessa
yhteydess{ on muotoa </tt //tmp//jtmp></sl<xxxx>> ja er{ty|ss{
</tt //tmp//nqs.+++></sl<xxx>>. Muuttuja </tt /$TMPDIR> sis{lt{{
t{m{n hakemiston nimen. Kun ty| loppuu, k{ytt|j{rjestelm{ siivoaa
hakemiston tiedostoineen pois.
 
Tilap{istiedostoja voi siten tehd{ helposti
nime{m{ll{ tiedoston </tt /$TMPDIR//> -alkuiseksi. 
 
</bf/ii<Ty|tiedostot>>
 
Tilap{istiedostoaluetta vastaava ty|alue on </tt/ii<//wrk>>, 
jonka alle on syyt{ tehd{ omia
alihakemistoja samoin kuin </tt //tmp> -hakemiston alle.
 
T{lle ty|alueelle on tarkoitus s{il|{ pitempiaikaista
s{ilytyst{ vaativia, mutta luonteeltaan tilap{isi{
tiedostoja.  T{llaisia ovat esimerkiksi ohjelmien
jatkoaloitus- eli restart-tiedostot, jatkok{sittely{
vaativat tulostustiedostot ym. 
 
T{ll{ alueella tiedostot s{ilyv{t jonkin aikaa, jonka
j{lkeen tiedostot voidaan joutua siirt{m{{n nauhalle, mik{li
levytilasta on puutetta.  Tiedostojen s{ilymisaika levyll{
tulee olemaan k{{nt{en verrannollinen niiden kokoon.  Suuret
tiedostot vied{{n herkemmin nauhalle.  Tiedostot
arkistoidaan automaattisesti </sc/ii<dmf>>-j{rjestelm{{n, josta
kerrotaan tarkemmin seuraavassa kohdassa
(magneettinauhatiedostot).  Arkistoidut tiedostot n{kyv{t
k{ytt{j{n hakemistossa, mutta niit{ ei voi k{ytt{{ ennekuin
on hakenut ne takaisin levylle. 
 
Ty|alueen tiedostoista ei oteta varmuuskopioita.
 
</bf/ii<Magneettinauhatiedostot>>
 
Tiedostojen magneettinauha-arkistointiin on k{ytett{viss{ 
</sc/ii<dmf>>-j{rjestelm{ (Data Migration Facility). Se sopii hyvin
tiedostoille, jotka arkistoidaan pitk{ksi ajaksi, ja joita ei
arkistoinnin aikana k{ytet{ kovin usein.  Esimerkiksi tiedosto, joka
s{ilytet{{n vuoden ja jota k{ytet{{n t{n{ aikana harvemmin kuin kerran
kuussa, on hyv{ arkistoitava. T{m{ rajoitus johtuu siit{, ett{
</sc dmf> tekee tiedostoista aina uuden nauhakopion ja jos kopioita tulee
paljon, joudutaan nauhoja tiivist{m{{n usein.
 
Tiedosto vied{{n </sc dmf>-arkistoon komennolla  /iii<dmput>

</copymode
      dmput </sl tiedosto>
>

Komento ei kest{ kuin hetken, koska se itseasiassa vie arkistoitavat
tiedostot jonoon. Arkisto-ohjelma purkaa jonossa olevat tiedostot
my|hemmin nauhalle omia aikojaan.
 
Kun tiedosto on viety arkistoon, siit{ j{{ tieto
k{ytt{j{n hakemistoon. N{in arkistoidutkaan tiedostot eiv{t p{{se unohtumaan.
Hakemistossa annetun tiedostolistauskomennon
</tt ls -l> tulostus n{ytt{{ silloin t{llaiselta:
 
</copymode
mrw-r--r--   1 lounamaa csc    10150410 Feb  1 01:00 sar01
mrw-r--r--   1 lounamaa csc    11311289 Mar  1 01:00 sar02
-rw-r--r--   1 lounamaa csc     4027079 Mar 19 01:00 sar03
>
 
Ensimm{isess{ sarakkeessa oleva </tt m> kertoo, ett{ tiedosto on
viety nauhalle eli migratoitu. Muut tiedostolistauksen tiedot ovat
aivan ajan tasalla, my|s tiedoston koko n{kyy, vaikka se ei viek{{n
levytilaa. 
 
Jos migratoitua tiedostoa yritt{{ k{ytt{{, saa virheilmoituksen </tt
cannot open>. Tiedosto tulee ensin palauttaa levylle komennolla
/iii<dmget>

</copymode
      dmget </sl tiedosto>
>

Komento j{{ odottamaan, ett{ operaattori asettaa nauhan
kasettiasemaan. Komennosta onkin paras k{ytt{{ muotoa 

</copymode
      nohup dmget </sl tiedosto> /&
>

joka k{ynnist{{ komennon taustaprosessina ja j{tt{{ sen k{yntiin,
vaikka yhteys katkeaisi.
 
Koska tiedoston palautus vaatii operaattorin paikalla oloa, sit{ ei voi
tehd{ kuin valvottuna aikana eli arkisin kello 8 -- 20.
 
Kun arkistoitua tiedostoa ei en{{ tarvita, sen voi tuhota
normaalisti </tt rm> -komennolla.  Komento ei hae tiedostoa
nauhalta, mutta poistaa sen tiedot nauhatietokannasta.  Sit{
ei ole siten en{{ mahdollista saada takaisin.  On
huomattava, ett{ tiedostojen arkistointi ei vastaa
varmuuskopiointia.  Jos vahingossa tuhotun, arkistoidun
tiedoston haluaa takaisin, se joudutaan yleens{ hakemaan
varmuuskopiointinauhoilta. 
 
</sc Unicosissa> on mahdollisuus tehd{ my|s omia nauha-arkistoja yleisill{
</sc unix> -komennoilla kuten </tt/ii<tar>> tai </tt/ii<cpio>>.
Nauhojen k{ytt| on kuitenkin sen verran hankalaa, ett{ yleisi{ ohjeita
ei t{m{n oppaan puitteissa ole mahdollisuus antaa. Yleisohje nauhojen
k{yt|ss{ onkin: kysy TLP:sta.
 
