\renewcommand{\thercsdate}{$ $Date: 2004/02/05 20:18:37 $ $}

\slidesection{Tiedostojärjestelmä}

\begin{slide}

\slideheading{Mikä on tiedostojärjestelmä?}

\bi
\item Tiedostojärjestelmä on se osa tietokonejärjestelmästä, joka
sisältää joitain (talletettuja) tietoja
\item Erityisesti tiedostojärjestelmä tarkoittaa sitä, \emph{miten} ja
missä muodossa nämä tiedot on talletettu
\item Unixin tiedostojärjestelmä on hyvin yksinkertainen: se koostuu
\newterm{hakemistoista}, ja näissä sijaitsevista toisista hakemistoista
(joita kutsutaan \newterm{alihakemistoiksi}) ja \newterm{tiedostoista}.
\item Hakemisto on siis käytännössä lista tiedostoja ja alihakemistoja
\item Hakemistot, alihakemistot ja ali"-alihakemistot muodostavat
\newterm{tiedostohierarkian}.  Unix"-järjestelmässä kaikki tiedostot
sijaitsevat yhdessä hierarkiassa, \newterm{juurihakemiston} alla.
\ei

\newslide

\notebox{Terminologiasta on huomattava sen verran, että ``tiedosto'' on
perinteisesti Unixissa tarkoittaanut oikeastaan mitä tahansa
tiedostojärjestelmässä olevaa: siis myös hakemistot ovat tämän
terminologian mukaan ``tiedostoja''.  Tästä syystä varsinaista tietoa
sisältäviä tiedostoja (jotka esitellään myöhemmin) on joskus kutsuttu
``tavallisiksi tiedostoiksi'' (\newterm{regular files}).  Tässä
opintomonisteessa puhutaan yleensä yksinkertaisesti tiedostoista ---
asiayhteydestä pitäisi käydä selväksi, sisältääkö käsite hakemistot vai
ei.}

\end{slide}

\begin{slide}

\slideheading{Miten tiedostoihin viitataan?}

Tiedoston (tai hakemiston) voi nimetä kahdella tapaa:
\begin{enumerate}
\item Voi käyttää \newterm{absoluuttista} tiedostonimeä:
\bi
\item tällöin kerrotaan tiedoston paikka aina juurihakemistosta lähtien.
\item esimerkiksi \cmdln{/etc/apt/sources.list} tarkoittaa juurihakemiston
\cmdln{etc}"-alihakemiston \cmdln{apt}"-alihakemiston tiedostoa nimeltä
\cmdln{sources.list}.
\item hakemistojen nimien väliin siis pannaan aina kauttaviiva
(\cmdln{/}).  Koska nimi tavallaan kertoo reitin juurihakemistosta
tiedostoon, sitä kutsutaan myös \newterm{poluksi} (path).
\item abs.~tiedostonimet alkavat aina kauttaviivalla.  Siksi
juurihakemiston itsensä nimi on \cmdln{/}.
\ei

\newslide

\item Voi käyttää \newterm{suhteellista} tiedostonimeä:
\bi
\item Unixissa ohjelmilla (myös komentotulkilla) on aina
\newterm{oletushakemisto}.  Siinä missä abs.~nimet ovat polkuja
suhteessa juurihakemistoon, suhteelliset nimet ovat polkuja suhteessa
oletushakemistoon.
\item esimerkiksi \cmdln{projektit/aatos.tex} tarkoittaa
oletushakemiston \cmdln{projektit}"-alihakemiston
\cmdln{aatos.tex}"-nimistä tiedostoa.
\item sisäänkirjauduttaessa oletushakemisto on käyttäjän
\newterm{kotihakemisto}.  Tämä tarkoittaa käyttäjän omaa paikkaa, johon
käyttäjä voi tallettaa omat tiedostonsa, asetuksensa jne.
\item kaikissa hakemistoissa on pseudohakemisto \cmdln{..}, joka viittaa
hakemiston ylähakemistoon.
\item esimerkiksi, jos oletushakemisto on \cmdln{/web/ling/kit}, nimi
\cmdln{../monako/index.html} viittaa samaan tiedostoon kuin abs.~polku
\cmdln{/web/ling/monako/index.html}.
\ei
\end{enumerate}

\end{slide}

\slidesection{Hakemistot}

\begin{slide}

\slideheading{Hakemistoihin liittyviä komentoja}

\commandscheme{ls}{[ -l ] [ -a ] [ \textit{hakemisto} ]}{LiSt}
Näyttää hakemiston sisällön, eli mitä tiedostoja ja hakemistoja se
sisältää.  Jos hakemiston nimeä ei anneta, näyttää oletushakemiston
sisällön.  Valitsin \cmdln{-l} antaa (paljon) enemmän yksityiskohtia
tiedostoista, ja \cmdln{-a} näyttää myös ns.~\newterm{piilotiedostot}
(näistä lisää tuonnempana).

\commandscheme{cd}{[ \textit{hakemisto} ]}{Change Directory}
Vaihtaa oletushakemistoa.  Vaihdon jälkeen kaikki suhteelliset
tiedostonimet ovat suhteessa uuteen oletushakemistoon.  Jos hakemiston
nimeä ei anneta, vaihtaa oletushakemistoksi kotihakemiston.

\commandscheme{pwd}{}{Print Working Directory}
Kertoo tämänhetkisen oletushakemiston.

\newslide

\commandscheme{mkdir}{\textit{hakemisto} [ \textit{hakemisto2} ...
]}{MaKe DIRectory}
Luo argumenteiksi annetut hakemistot.

\commandscheme{rmdir}{\textit{hakemisto}}{ReMove DIRectory}
Poistaa (tyhjän) hakemiston.

\commandscheme{mv}{\textit{hakemisto} \textit{uusinimipolku}}{MoVe}
Uudelleennimeää tai siirtää hakemiston (sisältöineen) uuteen paikkaan /
uudelle nimelle.  (Tiedoston nimipolku on oikeastaan sen sijainti, joten
uudelleennimeäminen ja siirtäminen ovat sama asia.)  Esim.~\cmdln{mv
projektit proj} vaihtaa projektit"-hakemiston nimeksi proj ja \cmdln{mv
build /tmp/mybuild} siirtää oletushakemiston
\cmdln{build}"-alihakemiston \cmdln{/tmp}"-hakemiston alihakemistoksi
\cmdln{mybuild}.

\end{slide}

\begin{slide}

\slideheading{Tositoimiin: hakemistot}

\begin{enumerate}
\item Käynnistä komentotulkki ja katso, mikä on oletushakemistona.
\item Katso, mitä tiedostoja se sisältää.
\item Katso, mitä tiedostoja juurihakemisto sisältää.
\item Tee uusi alihakemisto \cmdln{kokeilu}, katso, mitä tiedostoja se
sisältää, tee sille jokin ali"-alihakemisto ja katso, mitä tiedostoja
\cmdln{kokeilu} nyt sisältää.  Poista hakemistot.
\item Mene (vaihda oletushakemistoksi) \cmdln{/web/ling}, liikuskele
siellä ympäriinsä ja katsele, mitä tiedostoja siellä on.
\item Palaa kotihakemistoosi.
\item Katso \cmdln{pwd}:lla, mikä on kotihakemistosi absoluuttinen
polku.
\end{enumerate}

\end{slide}

\begin{slide}

\slideheading{Nippelitietoa poluista \extrastuff}

\bi
\item Jokaisessa hakemistossa on pseudohakemistot \cmdln{.} ja
\cmdln{..}, joista ensimmäinen viittaa hakemistoon itseensä ja
jälkemmäinen siihen hakemistoon, joka sisältää kyseisen hakemiston.
\item Hakemiston nimessä voi olla kauttaviiva (\cmdln{/}) lopussa.  Tämä
kauttaviiva jätetään huomiotta.  Samoin kaksi peräkkäistä kauttaviivaa
tiedostonimessä tulkitaan yhdeksi.
\ei

Siis esimerkiksi jos oletushakemisto on \cmdln{/home/p/k/pkalliok},
seuraavat polut osoittavat samaan hakemistoon:
\bi
\item \cmdln{tmp}
\item \cmdln{./tmp/}
\item \cmdln{../pkalliok//tmp/.}
\item \cmdln{/usr/../home/p/././k/pkalliok//../pkalliok//.//tmp}
\ei

\end{slide}

\slidesection{Tiedostot}

\begin{slide}

\slideheading{Mikä on tiedosto? (puoliteoriassa)}

\bi
\item Tiedosto on paikka, jossa on (tallessa) tietoa.
\item Unixin käsitys (tavallisesta) tiedostosta on hyvin
yksinkertainen: tiedoston sisältö on läjä merkkejä (esim.~luonnollisen
kielen tekstiä), tai oikeastaan merkkijono (tarkoittaa, että merkit ovat
tietyssä järjestyksessä).
\item Unix sinänsä ei aseta tämän kummempia rajoituksia tiedoston
muodolle.
\item Usein teksti on järjestelty riveiksi.  Rivinvaihtokin on yksi
merkki muiden joukossa.
\item Joskus rivit on järjestelty kentiksi (esim. jos tekstissä on
taulukko).  Kentänvaihto (``tab'') on myös yksi merkki.

\newslide

\item Tekstiä käsittelevät Unix"-ohjelmat käsittelevät tiedostoa
sellaisenaan: esimerkiksi se, mitä tekstinmuokkausohjelma \cmdln{emacs}
näyttää, vastaa merkki merkiltä sitä, mitä tiedostossa on.
\item Vastakohtana monet Windows"-ohjelmat, joilla kaikilla on omat
\newterm{tiedostomuotonsa}, jolloin ruudulla näkyvän tekstin ja
tiedostoon talletetun merkkijonon välillä ei välttämättä ole mitään
yhteyttä.
\item Joillain asioilla, kuten kuvilla ja äänellä, ei voi olla yksi
yhteen "-vastaavuutta merkkijonojen kanssa (toisin kuin tekstillä).
Niinpä näitä käsittelevät ohjelmat tallentavat kuvan tiedostoon jossain
tietyssä tiedostomuodossa.
\item Unix"-ohjelmat käyttävät yleensä standardeilla määriteltyjä
tiedostomuotoja (kuten JPEG, MP3 jne.)
\ei

\newslide

\notebox{Tiedostot, joiden nimi alkaa pisteellä (\cmdln{.}), ovat ns.
piilotiedostoja / piilohakemistoja.  \cmdln{ls}"-komento ei näytä niitä
ilman \cmdln{-a}"-valitsinta, eikä komentotulkin nimilavennus
(esitellään tuonnempana) kiinnitä oletuksena huomiota niihin.
Piilotiedostot sisältävät usein ohjelmien asetuksia tai muuta sellaista,
jonka ei oleteta kiinnostavan käyttäjää kovin paljon, ja yleensä
kotihakemisto on pullollaan erilaisten ohjelmien piilotiedostoja.  Myös
erikoishakemistot \cmdln{.} ja \cmdln{..} ovat piilotiedostoja.}

\end{slide}

\begin{slide}

\slideheading{Tiedostoihin liittyviä komentoja}

\commandscheme{cat}{[ \textit{tiedosto} \textit{tiedosto} ...
]}{CATenate}
Yhdistää argumentteina annetut tiedostot ja tulostaa ne näytölle.
\cmdln{cat tiedosto} on idiomaattinen tapa tulostaa yksi tiedosto
näytölle.

\commandscheme{less}{\textit{tiedosto}}{Ei muistisanaa}
Jos tiedosto on pitkä, \cmdln{cat} on huono keino sen tarkastelemiseksi.
\cmdln{less} näyttää tiedoston yksi näytöllinen kerrallaan.
\cmdln{less}"-komennon lyhyt käyttöohje on seuraavassa diassa.

\commandscheme{file}{\textit{tiedosto}}{what kind of FILE}
Kertoo (so. arvaa) tiedoston sisällön perusteella, minkä tyyppistä
tietoa tiedosto sisältää: onko se tekstiä, ohjelma, kuva, \ldots

\commandscheme{grep}{\textit{sana} [ \textit{tiedosto} \textit{tiedosto}
... ]}{Global RegExp Print}
Näyttää tiedosto(i)sta kaikki rivit, joilla esiintyy annettu sana.  Hyvä
tiedon etsintään.

\newslide

\commandscheme{cp}{[ -r ] [ -i ] \textit{lähde} [ \textit{lähde} ... ]
\textit{kohde}}{CoPy}
\commandscheme{mv}{[ -i ] \textit{lähde} [ \textit{lähde} ... ]
\textit{kohde}}{MoVe}
\commandscheme{rm}{[ -r ] [ -i ] \textit{tiedosto}}{ReMove}
Kopioi (\cmdln{cp}) tai siirtää (\cmdln{mv}) tiedoston tai tiedostoja
uuteen paikkaan.  \cmdln{cp} jättää lähdetiedoston jäljelle, kun taas
\cmdln{mv} poistaa sen.  \cmdln{rm} vain poistaa tiedoston (käytä
varoen!).

\cmdln{cp}:lla ja \cmdln{mv}:lla on kaksi toimintatapaa.  Jos
\textit{kohde} on olemassa oleva hakemisto, tiedostot tulevat sen sisään
samalla nimellä kuin olivat aiemmassakin paikassaan.  Muussa tapauksessa
lähdetiedostoja saa olla vain yksi ja \textit{kohde} on sen uusi
sijainti/nimi.

Valitsin \cmdln{-r} aiheuttaa, että \cmdln{cp} ja \cmdln{rm} voivat
käsitellä myös hakemistoja.  \cmdln{cp} tekee tällöin kopion
hakemistosta ja kaikesta sen alla olevasta (\newterm{rekursiivinen}
kopio), ja \cmdln{rm} poistaa koko hakemiston ja kaiken sen alla olevan.
\cmdln{mv}"-komennolle voi aina antaa lähteiksi myös hakemistoja.

\end{slide}

\begin{slide}

\slideheading{\cmdln{less}"-komennon lyhyt käyttöohje}

\cmdln{less} on hyvin monipuolinen ohjelma, joka on tarkoitettu
yksinomaan (teksti)tiedostojen tarkasteluun.  Koska monet muut
Unix"-ohjelmat käyttävät \cmdln{less}:a näyttääkseen tiedostoja, sen
jonkinlainen hallitseminen on tärkeää.  \cmdln{less}:n komennot ovat
hyvin lyhyitä, enintään muutaman näppäimenpainalluksen mittaisia.

\bi
\item Välilyönti vie tekstissä eteenpäin, \cmdln{b} (Back) taaksepäin.
\item Komento \cmdln{q} (Quit) vie ulos \cmdln{less}:sta.
\item Komento \cmdln{g} (Go) vie tiedoston alkuun, \cmdln{G} loppuun.
\item Tiedostosta voi etsiä jotain merkkijonoa komennolla \cmdln{/}
(kauttaviiva).  Tämän jälkeen kirjoitetaan etsittävä merkkijono ja
painetaan enter.  Samaa voi etsiä uudelleen komennolla \cmdln{n} (Next).
\ei

\end{slide}

\begin{slide}

\slideheading{Tulosteen ohjaus tiedostoon}

\bi
\item Tähän mennessä käsittelemämme komennot, silloin kun ne tulostavat
jotain, tulostavat sen näytölle.
\item Tulosteen voi ohjata myös tiedostoon.  Tämä tarkoittaa, että
teksti, joka olisi tullut näytölle, tuleekin tiedoston sisällöksi.
\item Tulosteen ohjaus on komentotulkin ominaisuus, ja sen takia se
tepsii kaikkiin ohjelmiin.
\item Lisäämällä komennon loppuun \cmdln{> \textit{tiedosto}} voidaan
ylikirjoittaa (tai luoda uusi) tiedosto.  Esimerkiksi \cmdln{echo
Hepskukkuu >tervehdys} luo tiedoston \cmdln{tervehdys}, jossa on sana
``Hepskukkuu'' ja rivinvaihto.
\item Lisäämällä komennon loppuun \cmdln{>{}> \textit{tiedosto}} voidaan
liittää komennon tuloste tiedoston perään tuhoamatta vanhaa sisältöä.
\ei

\end{slide}

\begin{slide}

\slideheading{Tositoimiin: tiedostot}

\begin{enumerate}
\item Kirjaudu sisään, käynnistä komentotulkki ja tee kokeiluille
uusi alihakemisto \cmdln{testausta}.  Vaihda se oletushakemistoksi.
\item Luo tiedosto \cmdln{mun\_jutut}, johon panet \cmdln{echo}:lla
jonkin elämänviisautesi.  Lisää elämänviisauksia tiedoston perään
\cmdln{echo}:lla.
\item Luo tiedosto \cmdln{tämä\_hetki} komennolla \cmdln{date
>tämä\_hetki}.
\item Tarkastele näiden tiedostojen sisältöä \cmdln{cat}:lla ja
\cmdln{less}:lla.
\item Tee \cmdln{mun\_jutut}"-tiedostosta kopio \cmdln{cp}:lla.  Lisää
siihen vielä joitain viisauksia.
\item Tee alihakemisto \cmdln{kopiot}, johon teet kopiot kaikista
tekemistäsi tiedostoista.

\newslide

\item Katso \cmdln{file}"- ja \cmdln{less}"-komennoilla, mitä
sisältävät/ovat esim.~nämä: \cmdln{/usr/include/stdio.h},
\cmdln{/bin/cat}, \cmdln{/etc/passwd} ja \cmdln{/tmp}.
\item Etsi \cmdln{/etc/passwd}"-tiedostosta tietoja itsestäsi (ja
kavereistasi) \cmdln{grep}"-komennolla ja \cmdln{less}"-komennolla.
Kumpi tuntuu kätevämmältä?
\item Tee \cmdln{echo}:lla itsellesi puhelinmuistio: kasa
nimi"-puhelinnumeropareja, yksi kullakin rivillä.  (Onko tällainen
vanhanaikaista nykyään?)  Etsi sieltä tietoja \cmdln{grep}:lla.
\item Siirrä puhelinmuistio (sekä ehkä elämänviisaustiedosto) turvaan
kotihakemistoosi, tuhoa muut kokeilutiedostot \cmdln{rm -r}:lla.
\end{enumerate}

\end{slide}

