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.
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/
:
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), elicd
-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 hakemistoonDesktop
, tämä tapahtuu kirjoittamallacd Desktop
. - Tutki uudelleen, mikä työhakemistosi on nyt.
- Tutki ensin, mikä työhakemistosi on, kirjoittamalla komento
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 komennollapwd
, missä sijaitset nyt. - Siirry vielä takaisin hakemistoon
Desktop
, jotta voimme kokeilla uudelleen: Nopein tapa siirtyä kotihakemistoon on se, että kirjoitat pelkästääncd
. Kokeile tätäkin ja tarkasta jälleen, missä työhakemisto on nyt.
- Jos käytät komentoriviä etätyöpöydällä, johon on yhdistetty
Windows-käyttöliittymästä, saat
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 esimerkiksixxyyzz
, niin sinun pitäisi kirjoittaa komentocd 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.
- Siirry hakemistoon, johon olet kloonannut kurssin tietovarastosi.
Jos olisit luonut kurssin tiedostoille alihakemiston
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.
- VAROITUS: Pelkkä
.
- 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~
).
- Sinun pitäisi edellisen kokeilun jälkeen sijaita siinä hakemistossa,
jossa tietovarastosi on kloonattuna. Siirry hakemistoon
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 hakemistobuild-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.
Caution
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ä. Esimerkiksimkdir 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. Esimerkiksicp ~/sekalaiset/*.txt ~/tekstit/
kopioi kaikki.txt
-päätteiset tiedostot kotihakemistossa olevastasekalaiset
-hakemistosta kotihakemistossa olevaantekstit
-hakemistoon.Kokeile itse:
- Kopioi kaikki työhakemiston sisältämät tiedostot edellä luomaasi alihakemistoon.
mv
eli move toimii samoin kuincp
, 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. Esimerkiksirm *.txt
poistaa kaikki työhakemistossa olevat tekstitiedostot.rmdir
eli remove directory poistaa polun hakemiston, jos se on tyhjä. Esimerkiksirmdir ~/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 komennollacat
, sitten komennollamore
ja vielä komennollaless
. (Tämä ohjelmakooditiedosto tietenkin sijaitsee jossain alihakemistoista.)
- Siirry
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, voidaandiff
-komennolla katsoa, mitä eroja odotettuun tulostukseen on. Esimerkiksi jos tiedostossamalliratkaisu.txt
on talletettuna se, mitä ohjelman pitäisi tulostaa jaomaohjelma.txt
se, mitä oma ohjelmakoodi tulosti, niin komennolladiff 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.)
- Valitse jokin tekemäsi ohjelmointitehtävä, johon kurssin
henkilökunta on antanut ohjelmakoodipohjan.
Katso komennolla
Komentoja tiedoston etsintään¶
find
etsii tiedostoja määritellyillä ehdoilla. Esimerkiksifind -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> ;
Esimerkiksifind ~/sekalaiset/ -name '*.txt' -exec cat {} ;
ajaa jokaiselle sekalaiset-hakemistossa olevalle.txt
-päätteiselle tiedostolle komennoncat
.Kokeile itse:
- Tulosta näytölle kaikki kotihakemistosi alihakemistoista löytyvät
.hh
päätteiset tiedostot.
- Siirry kotihakemistoosi ja etsi kaikki
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. Esimerkiksigrep kandi * -Rl
listaa kaikki tiedostot työhakemistosta ja sen alihakemistoista, joissa ilmenee sanakandi
.Kokeile itse:
- Hae työhakemistosta ja sen alihakemistoista kaikki sellaiset
.cpp
päätteiset tiedostot, joissa määritellään luokka, eli josta löytyy sanaclass
.
- Hae työhakemistosta ja sen alihakemistoista kaikki sellaiset
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ä.