Komentorivioperaatioita

Tässä materiaaliosiossa tarkastelemme ensin hakemistojen rakennetta (hakemistohierarkiaa). Sen tunteminen on edellytyksenä sille, että osaat käyttää komentorivin komentoja, joista muutamia oleellisimpia esitellään materiaalin loppuosassa.

Huomautus

Tässä kohdassa käytetään Linux-komentorivin komentoja, jotka toimivat ainakin Linux-etätyöpöydällä ja Git Bashissa. Windowsissa on oma komentorivinsä, jolla on hieman erilaiset komennot.

Hakemistot ja polut

Palautetaan vielä mieleen edellisellä sivulla ollut esimerkki, jossa kopioitiin koneelle ladattu tiedosto koodi.cpp hakemistosta Downloads hakemistoon /worktmp/ohj2_staff/rounds/03/code/:

Kopioinnin suorittaminen komentorivillä (``cp ~/Downloads/koodi.cpp /worktmp/ohj2_staff/rounds/03/code/``)

Kuvasta huomaamme, että komentorivillä toimiminen perustuu siihen, että tiedostoihin viitataan poluilla, jotka kertovat niiden sijainnin hakemistohierarkiassa. Ensimmäisenä tutustumme siihen, miten polut kirjoitetaan komentorivillä.

Jotta voit materiaaliin tutustuessasi testailla asioita myös itse, avaa komentorivi. Etätyöpöytäympäristössä tämä tapahtuu valitsemalla valikosta toiminto Application > System Tools > Terminal tai nopeammin Application > Favourites > Terminal.

Esimerkissä kutsuttiin ohjelmaa cp ja annettiin sille argumentteina kaksi polkua. Polut viittaavat johonkin sijaintiin tiedostojärjestelmässä. Ensimmäinen polku viittaa kopioitavan tiedoston sijaintiin ja toinen kohteeseen, eli siihen hakemistoon, johon tiedosto halutaan kopioida. Itseasiassa cp itsessään tulkitaan poluksi ohjelmaan, joka sijaitsee polussa /bin/cp. Komentoriville siis syötetään “osoitteita” ajettaviin ohjelmiin ja niille välitettäviä argumentteja.

  • Hakemisto (directory)

    Tarkoittaa Linuxissa täsmälleen samaa, mitä esimerkiksi Windows-käyttöjärjestelmissä kutsutaan kansioksi (folder). Kyseessä on puhtaasti historiaan pohjautuva nimeämiskäytäntö.

  • Työhakemisto (current directory, working directory)

    Työhakemisto tarkoittaa sitä hakemistoa, jossa sijaitset hakemistohierarkiassa komentoa kirjoittaessasi. Pysähdytään hetkeksi miettimään, mitä tämä tarkoittaa. Graafisessa käyttöliittymässä sinulla voi olla auki useita kansioita eri ikkunoissa ja voit vaikkapa siirtää tiedoston raahaamalla sen kuvakkeen ikkunasta toiseen. Tämän vuoksi graafista käyttöliittymää käyttäessäsi et välttämättä ajattele sijaitsevasi missään kansiossa. Sen sijaan komentorivillä sijaitset aina jossain kohdassa hakemistohierarkiaa. Voit tietenkin myös avata useita komentorivi-ikkunoita, joista jokaisessa voit siirtyä eri hakemistoon ja siten suorittaa komentoja eri sijainneissa hakemistohierarkiassa.

    Asetuksista riippuen komentorivin alussa saattaa näkyä nykyinen työhakemisto tai osittainen polku työhakemistoon. Joskus kuitenkin voi olla tarvetta selvittää työhakemiston polku ja se käy helposti komennolla pwd, joka tulostaa polun nykyiseen työhakemistoon.

    Työhakemisto on hakemisto, joka voidaan mieltää oletushakemistoksi. Jos käyttäjä ei ole kirjoittanut jollekin asialle sen tarkempaa polkua, niin oletetaan, että kyseinen asia sijaitsee työhakemistossa.

    Työhakemistoa voi vaihtaa komennolla cd (change directory), eli cd-komentoa voi ajatella siirtymäkomentona. Komennolle kirjoitetaan parametriksi se hakemistopolku, johon halutaan siirtyä.

    Kokeile itse:

    • Tutki ensin, mikä työhakemistosi on, kirjoittamalla komento pwd.
    • Siirry komentoa cd käyttäen hakemistoon Desktop, tämä tapahtuu kirjoittamalla cd Desktop.
    • Tutki uudelleen, mikä työhakemistosi on nyt.
  • Kotihakemisto (home directory, ~)

    Kun käyttäjä kirjautuu sisään Linux-järjestelmään, asetetaan työhakemistoksi automaattisesti käyttäjän kotihakemisto. Kaikki käyttäjän omat tiedostostot löytyvät kotihakemistosta tai sen alihakemistoista. Kotihakemiston polku on /home/<kayttajatunnus>, jossa tietenkin kohdan <kayttajatunnus> tilalla on oma käyttäjätunnuksesi. Komentorivikäyttöliittymässä kotihakemistoon voidaan viitata merkillä ~ (mato, tilde).

    Kokeile itse:

    • Jos käytät komentoriviä etätyöpöydällä, johon on yhdistetty Windows-käyttöliittymästä, saat ~-merkkin aikaan esim. painamalla ensin pohjaan Alt Gr ja tildenäppäin, päästämällä irti, ja painamalla lopuksi vielä välilyöntiä.
    • Siirry alihakemistosta takaisin kotihakemistoosi kirjoittamalla komento cd ~. Tutki jälleen komennolla pwd, missä sijaitset nyt.
    • Siirry vielä takaisin hakemistoon Desktop, jotta voimme kokeilla uudelleen: Nopein tapa siirtyä kotihakemistoon on se, että kirjoitat pelkästään cd. Kokeile tätäkin ja tarkasta jälleen, missä työhakemisto on nyt.
  • Polku tai hakupolku (path)

    Linuxissa, kuten kaikissa muissakin moderneissa käyttöjärjestelmissä, käyttäjä pystyy organisoimaan tiedostonsa haluamallaan tavalla eri hakemistoihin. Hakupolulla tarkoitetaan tekstimuotoista esitystapaa, jolla voidaan esittää tiedoston sijainti hakemistorakenteesta. Linuxissa hakupolku kirjoitetaan siten, että eri hakemistojen nimet erotellaan toisistaan “kautta”-merkillä (/). Esimerkiksi Windows-käyttöjärjestelmissä vastaava merkki on kaksinkertainen kenomerkki \\. Linuxissa kaikki hakupolut alkavat juuresta (root) (pelkkä /). Windows-käyttöjärjestelmissä polut alkavat kirjaimin nimetyistä asemista (esim C:\). Polku on siis analogia osoitteelle.

    Kokeile itse:

    • Siirry hakemistoon, johon olet kloonannut kurssin tietovarastosi. Jos olisit luonut kurssin tiedostoille alihakemiston ohj2 ja kloonannut sinne tietovarastosi siten, että hakemiston nimeksi tulee käyttäjätunnuksesi esimerkiksi xxyyzz, niin sinun pitäisi kirjoittaa komento cd ohj2/xxyyzz. Luonnollisesti käytät tässä niitä hakemiston nimiä, joita olet luonut.
    • Vihje: Polkuja voi helposti täydentää tabulaattorin (tab, sarkain) avulla. Mikä voi nopeuttaa kirjoittamista merkittävästi, mutta ennen kaikkea käyttäjän itse ei tarvitse muistaa polkua tai sen osia täysin ulkoa. Hakemistojen ja tiedostojen nimien automaattinen täydentäminen on myös vähemmän virhealtista kuin niiden kirjoittaminen käsin.

Polkuihin liittyviä erikoismerkkejä

Tässä on muutamia erikoismerkkejä, joita käytetään mm. hakupoluissa:

  • / - hakemistojen erotin.
    • VAROITUS: Pelkkä / viittaa juureen. Kannattaa olla varovainen! Kun esimerkiksi harjoittelemme hakemistojen poistamista, ei kannata sekoilla /-merkin kanssa ja vahingossa poistaa kaikkea juurihakemiston alla olevaa.
  • . - työhakemisto
  • .. - työhakemistoa hakemistohierarkiassa ylemmällä tasolla oleva hakemisto
  • ~ - kotihakemisto
  • * - määrittelemätön määrä mitä tahansa merkkejä
  • ? - yksi mikä tahansa merkki
  • [] - hakasulkeiden sisään voi määritellä vaihtoehtoisia merkkejä.

Esimerkkejä:

  • ~/* - viittaa kaikkeen, mitä löytyy kotihakemistossa

  • ~/Desktop/../* - sama kuin yllä

  • ~/*/*.txt - kotihakemiston kaikissa alihakemistoissa olevat .txt-päätteiset tiedostot

  • ./?????.txt - työhakemistossa olevat tiedostot, joiden nimessä on viisi mitä tahansa merkkiä ja .txt-pääte.

    Kokeile itse:

    • Sinun pitäisi edellisen kokeilun jälkeen sijaita siinä hakemistossa, jossa tietovarastosi on kloonattuna. Siirry hakemistoon Desktop kirjoittamalla vain yksi komento.
    • Siirry yhdellä komennolla takaisin hakemistoon, jossa tietovarastosi on kloonattuna, siten, että käytät eri erikoismerkkiä kuin edellä (eli jos käytit edellä ~, niin käytä nyt .., jos taas käytit edellä .., niin käytä nyt ~).

Ohjelman suorittaminen komentoriviltä

Kuten aiemmin todettiin, ohjelma ajetetaan komentoriviltä syöttämällä polku ajettavaan ohjelmaan. Jos olet esimerkiksi kääntänyt jonkin ohjelman työhakemistossasi ja käännöksenä tuotettu tiedosto on a.out. Saat ajettua ohjelmasi kirjoittamalla komentoriville ./a.out. Jos kirjoitat vain a.out komentotulkki todennäköisesti vastaa jotain tyyliin "command not found: a.out". Tämä johtuu siitä, että a.out ei viittaa mihinkään olemassa olevaan polkuun.

Kokeile itse:

  • Sinulla pitäisi olla jonkin kurssin aikana tekemäsi tehtävän ratkaisu käännettynä. Jos tietovarastossasi on esimerkiksi hakemisto hello_world johon olet toteuttanut ohjelman, niin tämän hakemiston rinnalla pitäisi käännöksen jälkeen olla myös hakemisto build-hello_world-Desktop-Debug, josta käännetty ohjelma löytyy. Siirry johonkin näistä build- -alkuisista hakemistoista.
  • Suorita sieltä löytyvä ohjelmatiedosto. Jos et ole vaihtanut Qt Creatorin asetuksia, niin ohjelmatiedoston nimi on sen hakemiston nimi, jossa ohjelmakoodisi sijaitsee.

Jotkin ohjelmat, kuten esimerkiksi cp sijaitsevat polussa (/bin/), jossa olevia ohjelmia voidaan ajaa mistä tahansa pelkällä ohjelman nimellä.

Suurin etu ohjelmien ajamisessa komentorivillä on argumenttien välittäminen ajettavalle ohjelmalle. Graafisessa käyttöliittymässä joutuu avaamaan jonkin käyttöliittymäosan, jossa voidaan määritellä syötettäviä argumentteja. Komentorivillä argumentit voi kirjoittaa suoraan ohjelmakutsun perään.

Standardin mukaisesti ohjelmien toimintaa ohjataan lipuilla (--alkuiset argumentit). Yhdellä viivalla annetaan tyypillisesti yhden kirjaimen lippuja ja kahdella viivalla sanoja.

Ohjelmien ajamisesta ja niiden käyttämistä lipuista saa tietoa argumentilla --help. Esimerkkinä cat --help tulostaa ohjeistuksen cat-ohjelman käytölle.

Kokeile itse:

  • Katso lisätietoja komennosta cp.

Komentoja hakemiston sisällön tarkasteluun

Seuraavaksi siirrymme tarkastelemaan ja kokeilemaan muutamia hyödyllisiä komentoja. Edellä siirryit komentorivillä hakemistoon, jossa oli suoritettava ohjelma. Se on hyvä työhakemisto myös jatkossa tehtäviä kokeiluja silmällä pitäen.

Hakemiston sisältöä voi tarkastella komennolla ls (lyhenne sanasta list). Komento tulostaa hakemistossa olevien tiedostojen ja alihakemistojen nimet. Tulosteessa on useita nimiä samalla rivillä, joten sitä voi olla hankala lukea. Lisäksi harvoin tarvitsee tietää pelkästään nimiä. Tämän takia ls-komentoa käytetään yleensä joidenkin vipujen kanssa:

  • -l - näyttää tulostettavat asiat riveittäin
  • -a tai --all - näyttää myös piilotetut tiedostot ja kansiot, jotka Linuxissa alkavat merkillä piste.

Varsin yleistä on siis käyttää komentoa ls -la, joka listaa kaikki työhakemistossa olevat tiedostot ja alihakemistot.

Hakemistojen sisällön voi näyttää rekursiivisesti puuna komennolla tree.

Komennot ls ja tree tarkastelevat oletusarvoisesti työhakemistoa, mutta niille voidaan myös erikseen määritellä tarkasteltava polku.

Kokeile itse:

  • Ota listaus työhakemiston sisältämistä tiedostoista useammalla eri tavalla.
  • Ota listaus hakemiston ~/Desktop sisältämistä tiedostoista. Huomaa, että voit tehdä tämän siirtymättä hakemistoon ~/Desktop.
  • Ota listaus tiedostoista, jotka sijaitsevat hierarkiassa pykälän korkeammalla kuin työhakemistosi.
  • Katso, onko kotihakemistossasi piilotettuja tiedostoja (= tiedostoja, joiden nimi alkaa pisteellä).

Komentoja tiedostojen ja hakemistojen manipulointiin

Seuraavaksi käydään läpi komentoja, joilla voit manipuloida tiedostoja ja hakemistoja.

Varoitus

Ennen kuin suoritat näitä komentoja, ole tarkkana, että ymmärrät, mitä olet tekemässä. Et varmastikaan halua alkaa selvitellä, saisiko harjoitellessa vahingossa tuhottuja tiedostoja palautettua jostain (versionhallinnasta tai varmuuskopioista).

Tämän kohdan kokeiluja tehdessäsi kannattaa varmuuden vuoksi olla yhdessä build- -alkuisista hakemistoista, koska niissä ei ole sellaisia tiedostoja, joiden tuhoutuminen haittaisi. Voithan aina luoda kaikki build- -alkuisen hakemiston sisältämät tiedostot uudelleen kääntämällä ohjelman Qt Creatorissa (jos vain projektihakemisto on tallella).

  • mkdir eli make directory luo uuden hakemiston määritellyllä nimellä. Esimerkiksi mkdir harjoitustyot luo työhakemistoon uuden hakemiston nimeltä harjoitustyot.

    Kokeile itse:

    • Luo työhakemistoon uusi alihakemisto jollakin valitsemallasi nimellä.
  • cp eli copy kopioi määritellyt lähteet kohteeseen. Esimerkiksi cp ~/sekalaiset/*.txt ~/tekstit/ kopioi kaikki .txt-päätteiset tiedostot kotihakemistossa olevasta sekalaiset-hakemistosta kotihakemistossa olevaan tekstit-hakemistoon.

    Kokeile itse:

    • Kopioi kaikki työhakemiston sisältämät tiedostot edellä luomaasi alihakemistoon.
  • mv eli move toimii samoin kuin cp, mutta tiedostot siirretään kopioinnin sijaan.

    Kokeile itse:

    • Muokkaa alihakemistossa olevien tiedostojen nimiä siten, että niissä on jokaisessa alussa piste.
    • Testaa samalla uudelleen piilotettujen tiedostojen näkymistä tiedostolistauksessa. Kokeile ls-komentoa sekä vivulla -a että ilman sitä.
  • rm eli remove poistaa määritellyn polun. Esimerkiksi rm *.txt poistaa kaikki työhakemistossa olevat tekstitiedostot.

  • rmdir eli remove directory poistaa polun hakemiston, jos se on tyhjä. Esimerkiksi rmdir ~/harjoitustyot poistaa edellä määritellyn hakemiston.

    Kokeile itse:

    • Poista yksi luomassasi alihakemistossa olevista tiedostoista.
    • Poista kaikki alihakemistossa jäljellä olevat tiedostot.
    • Poista alihakemisto.

Komentoja tekstitiedoston sisällön tarkastelemiseen

  • cat eli concatenate tulostaa tekstitiedoston sisällön standardiin tulostusvirtaan eli oletuksena komentoriville (katenoi tiedoston). Tämä helpottaa komentorivillä työskentelyä, kun tiedostojen sisältöä tarkastellakseen ei tarvitse aina avata jotain graafista tekstieditoria. Tämä on kaikkein yksinkertaisin tapa katsoa tekstitiedoston sisältöä.

  • more tulostaa tiedoston sisällön sivu kerrallaan, että pystyt lukemaan ensimmäisetkin rivit pidemmistä tiedostoista. Pääset eteenpäin painamalla välilyöntinäppäintä.

  • less tulostaa sisällön komentoriviltä selattavaksi, jolloin tekstiä voi vierittää nuolinäppäimillä. Ohjelmasta pääsee pois painamalla näppäintä q.

    Kokeile itse:

    • Siirry build- -alkuisesta hakemistosta yksi pykälä ylöspäin hakemistohierarkiassa ja katso jonkin kirjoittamasi pitkän ohjelmakooditiedoston sisältö ensin komennolla cat, sitten komennolla more ja vielä komennolla less. (Tämä ohjelmakooditiedosto tietenkin sijaitsee jossain alihakemistoista.)
  • diff eli difference vertaa kahta eri tiedostoa rivi riviltä ja tulostaa eroavaisuudet. Tätä voi hyödyntää pienissä määrin esimerkiksi testaamiseen. Jos tiedetään etukäteen, mitä ohjelman pitäisi tulostaa, voidaan diff-komennolla katsoa, mitä eroja odotettuun tulostukseen on. Esimerkiksi jos tiedostossa malliratkaisu.txt on talletettuna se, mitä ohjelman pitäisi tulostaa ja omaohjelma.txt se, mitä oma ohjelmakoodi tulosti, niin komennolla diff malliratkaisu.txt omaohjelma.txt näet tulosteiden erot. (Komento tulostaa kummallisen näköisiä merkkejä rivien alkuun yms.)

    Kokeile itse:

    • Valitse jokin tekemäsi ohjelmointitehtävä, johon kurssin henkilökunta on antanut ohjelmakoodipohjan. Katso komennolla diff, mitä eroavaisuuksia toteuttamallasi ratkaisun ja ohjelmakoodipohjan välillä on.
    • Osaatko päätellä, mitä merkit < ja > rivien alussa tarkoittavat? (Halutessasi voit selvittää asian vaikkapa googlettamalla.)

Komentoja tiedoston etsintään

  • find etsii tiedostoja määritellyillä ehdoilla. Esimerkiksi find -name '*.txt' näyttää kaikki polut .txt-päätteisiin tiedostoihin, jotka ovat työhakemistossa ja sen alihakemistoissa.

    Kokeile itse:

    • Siirry kotihakemistoosi ja etsi kaikki .hh päätteiset tiedostot, joita kotihakemistostasi tai sen alihakemistoista löytyy.

    Hakutuloksille voidaan myös suorittaa komentoja -exec <komento> ; Esimerkiksi find ~/sekalaiset/ -name '*.txt' -exec cat {} ; ajaa jokaiselle sekalaiset-hakemistossa olevalle .txt-päätteiselle tiedostolle komennon cat.

    Kokeile itse:

    • Tulosta näytölle kaikki kotihakemistosi alihakemistoista löytyvät .hh päätteiset tiedostot.
  • grep eli globally search a regular expression and print hakee määriteltyä merkkijonoa. Komentoa voi hyödyntää esimerkiksi tiedostojen sisällön hakuun tai jonkin toisen komennon tulosten suodattamiseen putkituksen avulla. Esimerkiksi grep kandi * -Rl listaa kaikki tiedostot työhakemistosta ja sen alihakemistoista, joissa ilmenee sana kandi.

    Kokeile itse:

    • Hae työhakemistosta ja sen alihakemistoista kaikki sellaiset .cpp päätteiset tiedostot, joissa määritellään luokka, eli josta löytyy sana class.

Komentoja tekstitiedoston sisällön muokkaamiseen

Pikkumuokkaukset useampaan tiedostoon: sed

Komentoriviltä voidaan ajaa myös editoreja, joilla tekstitiedoston sisältöä voidaan muokata suoraan ajettavalla komennolla, esimerkkinä Stream Editor eli sed. Tämä mahdollistaa massaoperaatiot useille tiedostoille.

Stream Editorilla voi lisätä tai muokata yksittäisiä rivejä, esimerkiksi korvata tai poistaa sanoja. Erikoismerkkien (esim. *) avulla voit suorittaa saman muokkauksen sed:llä useammalle tiedostolle kerralla yhdellä komennolla. Tarkempaa tietoa löytyy käyttöohjeista sekä Wikipediasta.

Stream Editor on todella kätevä jos haluat tehdä jonkin pienen muutoksen moneen eri tiedostoon, esimerkiksi korvata yhden tietyn sanan jollakin toisella sanalla useammista eri tiedostoista.

Kokeile itse: Seuraavan tehtävän b-kohta

Isommat muokkaukset: editorit

Yleissivistyksenä on hyvä tietää, että jos haluat kirjoittaa tekstiä johonkin tiedostoon, voit myös suorittaa komentoriviltä useita erilaisia alkeellisia graafisia editoreita, kuten vaikka vim, pico, jed, jne.

Eri Linux-jakeluiden välillä on eroja siinä, mitkä editorit tulevat oletuksena mukana. Kaikissa järjestelmissä on kuitenkin yleensä editori nimeltä vim. Sama vim aukeaa yleensä myös Gitin oletuseditorina, joten sitä kannattaa opetella käyttämään edes alkeellisesti, tai edes tietää miten se suljetaan. Siinä on eri tiloja, jotka reagoivat eri tavoilla näppäimistösyötteeseen. Internet on täynnä ohjeita, mutta tässä kaikkein olennaisimmat tiedot lyhyesti ja nopeasti.

komento-tila - oletustila, jossa vim käynnistyy. Komentotilassa voidaan antaa erilaisia käskyjä hakemisesta tiedoston tallentamiseen. Aivan peruskomentoina kannattaa tietää:

  • :q- sulkee ohjelman, jos tiedostossa ei ole tallentamattomia muutoksia
  • :wq - kirjoittaa tiedoston levylle ja sulkee ohjelman
  • :q! - sulkee ohjelman ja hylkää tehdyt muutokset.

insert-tila - tavallinen tekstinsyöttö-tila. Tilaan pääsee komentotilasta i-näppäimellä. Tilasta pääsee takaisin komentotilaan esc-näppäimellä.