Kieliteknologian ATK-ympäristö Kuudes luento Miikka Silfverberg Nykykielten laitos 11. lokakuuta 2010 Miikka Silfverberg (Nykykielten laitos) Kieliteknologian ATK-ympäristö: Luento 6 11. lokakuuta 2010 1 / 13
Kuudes luento Tiedostojen ja hakemistojen pakkaaminen ja purkaminen gzip ja tar. Tiedostojen ja hakemistojen etsiminen find. Ehto- ja toistolauseet skripteissä Aritmeettiset testit ja merkkijonotestit. if... elif... else for. Miikka Silfverberg (Nykykielten laitos) Kieliteknologian ATK-ympäristö: Luento 6 11. lokakuuta 2010 2 / 13
Pakkaaminen ja purkaminen gzip pakkaa yksittäisiä tiedostoja. Komento $ gzip mehiläisten elämä.txt lyhyitä kertomuksia.txt luo kaksi pakattua tiedostoa mehiläisten elämä.txt.gz ja lyhyitä kertomuksia.txt.gz. mehiläisten elämä.txt pakkautuu alkuperäisestä 400 kilotavusta 150 kilotavuun gzipillä. Paketin saa purettua käskyllä gunzip $ gunzip mehiläisten elämä.txt Miikka Silfverberg (Nykykielten laitos) Kieliteknologian ATK-ympäristö: Luento 6 11. lokakuuta 2010 3 / 13
Pakkaaminen ja purkaminen tar pakkaa kokonaisia hakemistoja ja muita tiedostokokoelmia. Käskyt $ tar -c -z -f gutenberg.tgz mehiläisten elämä.txt lyhyitä kertomuksia.txt $ tar -c -z -f clt130.tar.gz clt130 luovat paketit gutenberg.tgz ja clt130.tar.gz (clt130 on hakemisto). Käskyllä voi luoda myös bzip2-paketteja. Näissä on parempi pakkaussuhde, mutta niiden pakkaaminen kestää kauemmin. tar pakkaa paitsi zip-paketteja myös bzip2-paketteja. Näissä on parempi pakkaussuhde, mutta pakkaaminen kestää kauemmin. Ne nimetään useimmiten tiedosto.tar.bz2 tar osaa myös purkaa $ tar -x -z -f clt130.tar.gz $ tar -x -j -f clt130.tar.bz2 Miikka Silfverberg (Nykykielten laitos) Kieliteknologian ATK-ympäristö: Luento 6 11. lokakuuta 2010 4 / 13
Tiedostojärjestelmästä etsiminen Etsitään kotihakemiston alihakemistoista tiedostoja joiden nimi alkaa mehiläisten elämä $ find -name "mehiläisten elämä*" /home/u3/silfverb/kurssit/clt130/mehiläisten elämä.freq /home/u3/silfverb/kurssit/clt130/mehiläisten elämä.txt.freq /home/u3/silfverb/kurssit/clt130/mehiläisten elämä.txt.gz /home/u3/silfverb/kurssit/clt130/mehiläisten elämä.txt Etsitään kotihakemiston alihakemistoista yli 100 megatavun tiedostoja $ find -size +100M Etsitään ohjelmia ja skriptejä joiden nimessä on laske $ find -perm /u+x -name "*laske*" Miikka Silfverberg (Nykykielten laitos) Kieliteknologian ATK-ympäristö: Luento 6 11. lokakuuta 2010 5 / 13
Testit Prosessin suoritus voi päättyä joko normaalisti tai virheellisesti. Edellisen prosessin päätöstila tallentuu muuttujaan $?. $ cat mehiläisten elämä.txt > /dev/null $ echo $? 0 $ cat mehiläisten elämä.txtt > /dev/null cat: mehiläisten elämä.txtt: Tiedostoa tai hakemistoa ei ole $ echo $? 1 Normaalisti päättyvä prosessi saa koodin 0 ja virheellisesti päättyvä prosessi jonkin muun koodin kuten 1 tai 127. Miikka Silfverberg (Nykykielten laitos) Kieliteknologian ATK-ympäristö: Luento 6 11. lokakuuta 2010 6 / 13
Testit Komentoa [ käytetään totuustesteihin. Se ottaa argumenttilistan, jossa viimeinen argumentti on aina ]. Viimeistä edeltävät argumentit muodostavat testin $ [ 1 -eq 2 ] $ echo $? 1 $ [ 1 -eq1 ] $ echo $? 0 $ LUKU=1 $ [ $LUKU -eq 1 ] $ echo $? 0 Miikka Silfverberg (Nykykielten laitos) Kieliteknologian ATK-ympäristö: Luento 6 11. lokakuuta 2010 7 / 13
Testit Seuraavat testit onnistuvat eli ovat tosia: $ [ 1 -eq 1 ] $ [ 1 -ne 2 ] $ [! 1 -eq 2 ] $ [ "koira" == "koira" ] $ [ "koira"!= "kissa" ] $ [ "koira" == "koira" -a 1 -eq 1 ] $ [ "koira" == "kissa" -o 1 -eq 1 ] $ [ 1 -le 2 ] Seuraavat testit onnistuvat jos on olemassa tiedosto tiedosto.txt ja hakemisto hakemisto $ [ -f tiedosto.txt ] $ [ -d hakemisto ] Mikäli tiedostoon tiedosto.txt on lukuoikeus seuraava testi onnistuu $ [ -r tiedosto.txt ] Miikka Silfverberg (Nykykielten laitos) Kieliteknologian ATK-ympäristö: Luento 6 11. lokakuuta 2010 8 / 13
Ehtolause Käyttämällä if/then rakennetta, voidaan käyttää testejä valitsemaan mitä komentoja suoritetaan $ if [ $LUKU -eq 1 ] > then > echo "yksi oli!" > fi yksi oli! $ if [ $LUKU -eq 2 ] > then > echo "kaksi oli!" > else > echo "ei ollut kaksi!" > fi ei ollut kaksi! Miikka Silfverberg (Nykykielten laitos) Kieliteknologian ATK-ympäristö: Luento 6 11. lokakuuta 2010 9 / 13
Ehtolause Muuttuja $# tallentaa skriptin komentoriviargumenttien lukumäärän $ cat laske frekvenssilista.sh #! /bin/bash if [ $# -ne 2 ] then echo "Käyttö: $0 lähdetiedosto kohdetiedosto" 1>&2 exit 1 else echo "Luetaan tiedostosta $1" 1>&2 echo "Kirjoitetaan tiedostoon $2" 1>&2 cat $1 tr -s \t\r \n tr A-ZÅÄÖ a-zåäö sort uniq -c sort -nr > $2 fi Miikka Silfverberg (Nykykielten laitos) Kieliteknologian ATK-ympäristö: Luento 6 11. lokakuuta 2010 10 / 13
Toistolause Usein halutaan tehdä sama operaatio isolle joukolle tiedostoja. Esim. voi olla että hakemistossa on sata kirjaa, ja jokaisesta halutaan laskea frekvensilista. Tällöin käytetään toistorakennetta for. $ for tiedosto in * > do >./laske frekvenssilista.sh "$tiedosto" "$tiedosto".freq > done for-käsky käy läpi jokaisen tiedostonimen tämänhetkisessä hakemistossa, tallentaa sen muuttujaan tiedosto ja ajaa käskyn laske frekvenssilista.sh. $ for i in "yksi" "kaksi" > do > echo "$i" > done yksi kaksi Miikka Silfverberg (Nykykielten laitos) Kieliteknologian ATK-ympäristö: Luento 6 11. lokakuuta 2010 11 / 13
Toistolause Käyttämällä -merkkejä voi luoda forille argumenttilistan unixin käskyillä. -merkki löytyy ainakin suomalaisesta pc-näppäimistöstä plus- ja kysymysmerkin oikealta puolelta. $ cat english.txt Heres some mipselled text. $ for i in cat english.txt > do > echo "$i" > done Heres some mipselled text. Miikka Silfverberg (Nykykielten laitos) Kieliteknologian ATK-ympäristö: Luento 6 11. lokakuuta 2010 12 / 13