jPV | jpv@amigascne.org
Kuukauden komentorivi: List-käsky

Kuukauden komentorivi -sarjassa tutustutaan Amigan monipuolisen komentoliittymän tarjontaan ja pyritään käytännön esimerkein tuomaan uusia kuvakulmia sen käyttöön. Kaikkihan ovat kuulleet, kuinka hieno Amigan komentotulkki on, mutta harva sen ominaisuuksia tulee kuitenkaan hyödyntäneeksi, ainakaan lisäoptioiden muodossa.

Sarjan ensimmäisessä ja todennäköisesti viimeisessä osassa tutustutaan List-käskyyn ja eritoten sen upeaan LFORMAT-optioon. Useimmat meistä ovat tottuneet käyttämään Dir- ja List-käskyjä tiedostojen listaamiseen, mutta yleensä vain perusmuodossaan tai korkeintaan ALL-option kera. Osa on kuullut kryptiseltä vaikuttavasta LFORMAT-optiostakin, mutta pelko sen monimutkaisuudesta on jättänyt opettelun tekemättä. Tuttu tilanne itsellenikin, kunnes erään kerran todellakin mietin, eikö tuon listauksen saaminen eri muotoon auttaisi erästäkin projektia huomattavasti. Eihän se optio sitten ollutkaan lainkaan monimutkainen, ja sen jälkeen sitä on tullut käytettyä vaikka minkälaiseen tekemiseen.
Jokerimerkit
Kerrataanpa ensin hieman Amigan jokerimerkkien käyttöä, sillä pelkän perus-List-käskyn kanssakin on hyvä osata valikoida listattavia tiedostoja. Jo pelkkä jokerimerkkien käyttö antaa Amigalla monipuolisempia vaihtoehtoja kuin monissa muissa järjestelmissä.

Jos <mj> vastaa mitä tahansa merkkijonoa, niin jokerimerkit toimivat seuraavasti:

? Mikä tahansa yksittäinen merkki.
#<mj> Mikä tahansa määrä merkkijonon <mj> toistoa.
<mj1>|<mj2> <mj1> tai <mj2>.
~<mj> Kaikki muut paitsi <mj>.
() Rajaavat merkkijonon.
[<mj1>-<mj2>] Merkit mj1:n ja mj2:n väliltä.
% Tyhjä merkkijono.
`<mj> <mj>:n ollessa myös jokerimerkki.

Eli #? vastaa muilta järjestelmiltä tuttua *-merkkiä, koska siinä hyväksytään mikä tahansa määrä mitä tahansa merkkiä. Siispä esimerkiksi "List #?.info" listaa kaikki .info -nimeen päättyvät tiedostot. "List ~(#?.info)" taasen listaa kaikki muut paitsi .info-päätteiset tiedostot ja "List #?(.lha|.lzx|.zip)" kaikki .lha, .lzx ja .zip -päätteiset tiedostot.

Jokerimerkkejä voi yhdistellä mielin määrin ja ryhmitellä valintoja sulkujen avulla. Ääripään esimerkkinä "List ([a-e]#?.mod|mod.[a-e]~(#?(music|party)#?))" listaa kaikki aakkosissa a:n ja e:n välisillä kirjaimilla alkavat .mod- ja mod.-tunnisteiset tiedostot paitsi music tai party -sanat myöhemmin tiedostonnimessä sisältävät mod.-tiedostot.
List-käskyn optiot
List-käsky hyväksyy seuraavat optiot:

PAT Lauseke, joka rajoittaa listattavia tiedostoja. Voi sisältää jokerimerkkejä.
KEYS Näyttää muiden tietojen lisäksi myös header-blokin numeron.
DATES Näyttää päivämäärät esim. QUICK-option kanssa sekä yhtenäisessä muodossa eikä esim. Today-tekstinä.
NODATES Päivämääriä ei näytetä tulostuksessa.
TO <nimi> Ohjaa tulostuksen tiedostoon tai laitteeseen.
SUB <mj> Listaa vain tiedostot, joiden nimestä löytyy merkkijono <mj>.
SINCE <pvm> Listaa tiedostot, jotka ovat päivittyneet päivämäärän jälkeen. Esim. "List SINCE 22-Apr-13", "List SINCE Yesterday", "List SINCE Monday"
UPTO <pvm> Listaa tiedostot, jotka ovat päivittyneet ennen tiettyä päivää.
QUICK Näyttää pelkästään tiedostojen ja hakemistojen nimet.
BLOCK Näyttää tiedostojen koot blokkeina eikä tavuina.
NOHEAD Poistaa yhteenvetotiedot yms. tulostuksesta.
FILES Listaa tiedostot, mutta ei hakemistoja.
DIRS Listaa hakemistot, mutta ei tiedostoja.
LFORMAT Määrittää tulostuksen muotoilun.
ALL Listataan myös alihakemistojen sisältö.

Optioita voidaan yhdistellä vapaasti. Esimerkiksi "List SYS: ALL FILES SINCE Today NOHEAD" näyttää listan kaikista käynnistysosiolla olevista tänään muuttuneista tiedostoista. Kyseinen esimerkki on näppärä tapa tarkastella mihin joku muutos tallensi tietonsa.

Poiketaan vielä sen verran muihin käskyihin, että pitkät optiorimpsuthan saa kätevästi yhden lyhyen käskyn alle Alias-käskyä käyttämällä. Voit esimerkiksi tehdä ltoday-aliaksen, joka listaa vain ja ainoastaan saman päivän tiedostot tällaisella rivillä: "Alias ltoday List ALL FILES SINCE Today UPTO Today NOHEAD". Tämän jälkeen "ltoday SYS:"-komento listaa tuoreet tiedostot SYS: osiolta, tosin vain siitä komentorivi-ikkunasta, jossa Alias-käsky ajettiin. Jos haluat aliakset käyttöön aina shelliä käytettäessä, tallenna kyseinen rivi S:shell-startup -tiedostoon.
LFORMAT-optio
     
"Varsinaiseen loistoonsa LFORMAT pääsee kuitenkin kun unohdetaan hetkellinen näytölle listaus ja huomataan sen tarjoamat mahdollisuudet komentotiedostojen eli skriptien tekoon."
Sitten päästäänkin itse asiaan. Usein tulee eteen tilanteita, jolloin Dir-käsky tai List-käsky QUICK-optiolla näyttävät aivan liian suppeasti tietoa. Samoin pelkkä List-käsky näyttää ihan liikaa informaatiota
tiedostokommentteineen sun muineen.

LFORMAT-optiolla voi määrittää tulostettavan informaation muodon täysin oman mielen mukaan. Optiolle annettava merkkijono tulostuu jokaisen listattavan tiedoston kohdalla ja se voi sisältää lähes mitä tahansa merkkejä sekä tiettyjä muotoiluoperaattoreita, joilla saadaan mukaan List-käskyn normaalisti tarjoamaa tietoa.

Esimerkkejä muotoiluoperaattoreista:

%A tulostaa tiedostoattribuutit
%C tulostaa tiedoston kommentit
%D tulostaa tiedoston päivämäärän
%E tulostaa tiedoston päätteen
%L tulostaa tiedoston pituuden tavuina
%M tulostaa tiedoston nimen ilman päätettä
%N tulostaa tiedoston nimen
%P tulostaa polun, jossa tiedosto sijaitsee
%T tulostaa kellonajan, jolloin tiedostoa on käsitelty

Jokaiselle muotoiluoperaattorille voidaan myös määrittää kentän pituus laittamalla pituutta ilmaiseva numero prosenttimerkin jälkeen. Esimerkiksi %30N varaa nimelle 30 merkin pituisen alueen. %30N tasaa nimen oikeaan laitaan ja %-30N vasempaan laitaan.

Jos haluat esimerkiksi koko CD-levyn sisällöstä siistin listan, jossa ilmoitetaan vain jokaisen tiedoston polku ja nimi, eikä mitään muuta:

List CD0: ALL LFORMAT="%P%N"
Komentotiedostojen luominen
Varsinaiseen loistoonsa LFORMAT pääsee kuitenkin kun unohdetaan hetkellinen näytölle listaus ja huomataan sen tarjoamat mahdollisuudet komentotiedostojen eli skriptien tekoon. Tulostusmuotoiluun kun voi ujuttaa esimerkiksi käskyjä ja escape-koodeja, ja ohjata List-käskyn tulostus erilliseen tiedostoon, jonka voi sitten ajaa myöhemmin. Tulostuksen ohjaaminen tiedostoon tapahtuu joko TO-optiolla tai käyttämällä järjestelmän > tai >> -operaattoria. Uudenlaisia käyttömahdollisuuksia avautuukin rajattomasti!

Kuvitellaan tilanne, että hakemistossa on sekalainen kasa tiedostoja, jotka on nimetty miten sattuu. Esimerkiksi jpeg-tiedostoja on .jpg, .jpeg ja .jpe -päätteillä ja haluaisit ne kaikki siististi .jpg-päätteisiksi ja vielä siirrettyä vaikka "Work:Pics/"-hakemistoon. Yllättäen koko tehtävä hoituukin vain kahdella komentorivikäskyllä. Ensimmäisellä List-käskyllä luodaan komentotiedosto ja toisella Execute-käskyllä toimeenpannaan se.

Rakennetaanpa haluamamme List-käskyrivi vaihe vaiheelta ja kokeillaan, että se toimii haluamallamme tavalla joka vaiheen jälkeen.

Toimenpide on tarkoitus kohdistaa vain eripäätteisille jpeg-kuvatiedostoille, joten kokeillaan listata niiden nimet:

List #?.(jpg|jpeg|jpe) LFORMAT="%N"
Mikäli haluaisimme vain nimetä ne uudelleen samaan hakemistoon. %M antaa tiedoston nimen ilman päätettä:

List #?.(jpg|jpeg|jpe) LFORMAT="Rename %N TO %M.jpg"

Tulostuksen pitäisi siis näyttää toimivilta AmigaDOS-käskyiltä, joita ei kuitenkaan ajeta vielä tässä vaiheessa.
Lisätään käskyihin siirto eri hakemistoon:

List #?.(jpg|jpeg|jpe) LFORMAT="Rename %N TO Work:Pics/%M.jpg"

Nyt näyttää jo aika hyvältä, mutta muistetaanpa, että tiedostojen nimissä voi olla myös välilyöntejä, joten nimet on hyvä saada lainausmerkkien sisään. Lainausmerkkejä ei voi lisätä sellaisenaan, jotta LFORMAT-merkkijono ei katkeaisi ennen aikojaan.

Tulostettavien lainausmerkkien eteen on lisättävä *-merkki:

List #?.(jpg|jpeg|jpe) LFORMAT="Rename *"%N*" TO *"Work:Pics/%M.jpg*""
Lopuksi lisätään ohjaus komentotiedostoksi. Väliaikaiseen käyttöön tehtävät tiedostot voi tallentaa vaikka T:hen:

List #?.(jpg|jpeg|jpe) LFORMAT="Rename *"%N*" TO *"Work:Pics/%M.jpg*"" > T:jpeg_ajo

Nyt meillä on siis AmigaDOS-skripti, jonka sisältämät käskyt voidaan ajaa Execute-käskyllä:

Execute T:jpeg_ajo
Lisäkikkailua
Jos tiedostojen valinta halutaan laajentaa kattamaan myös alihakemistot, eli toimimaan rekursiivisesti, täytyy valinta suorittaa PAT-optiolla ja lisätä komentoon ALL-optio. Edellinen esimerkki muuttuisi tällöin muotoon:

List PAT=#?.(jpg|jpeg|jpe) ALL LFORMAT="Rename *"%P%N*" TO *"Work:Pics/%M.jpg*"" > T:jpeg_ajo

LFORMAT-option tulostus voidaan myös jakaa eri riveille lisäämällä muotoilulausekkeeseen rivinvaihto *N-merkkijonolla:
Tällöin saamme komentotiedostoihin rajattomasti eri komennoilla suoritettavia rivejä jokaista yksittäistä tiedostoa kohden. Lisätäänpä vaikka lokitiedoston teko edelliseen esimerkkiin. Lisäämällä omalle rivilleen "Echo %P%N >> RAM:renamedfiles.txt" saamme ram-levylle listan kaikista käsitellyistä tiedostoista.

List PAT=#?.(jpg|jpeg|jpe) ALL LFORMAT="Rename *"%P%N*" TO *"Work:Pics/%M.jpg*"*NEcho %P%N >> RAM:renamedfiles.txt" > T:jpeg_ajo

Käyttömahdollisuuksia rajoittaa vain mielikuvitus. Tässäkin tapauksessa mukaan voitaisiin ujuttaa rivejä, jotka käyttäisivät vaikka kuvankäsittelyohjelmaa skaalaamaan kaikki halutut tiedostot tai lähettämään tiedostot FTP:llä verkkoon. Kaikenlainen automatisointi onnistuu siis aika pitkälle jo pelkällä AmigaDOS:lla ennen järeämpään ARexx:iin turvautumista.

Yhtenä käytännön esimerkkinä tein AmigaDOS-skriptin, joka perustuu List-käskyn käyttöön. Se tarkastaa rekursiivisesti kaikkien löytyvien tiedostopakettien ehjyyden ja tulostaa tietoa edistymisestä komentoliittymän ikkunaan. Escape-koodeja käyttämällä näytön tulostusmäärä pysyy kurissa, kun kursorin voi palauttaa edellisen rivin päälle näyttämään vain sillä hetkellä käsiteltävää tiedostoa. Esimerkkilistaus löytyy täältä:

http://jpv.wmhost.com/files/testall.script

Kuten tästäkin pintaraapaisusta voi todeta, AmigaDOS tarjoaa hurjasti ominaisuuksia. Suosittelen kaikkia etsimään käsiinsä esimerkiksi viralliset AmigaOS 3.x -ohjekirjat. Niistä oppii paljon uusia ja jo unohtuneita asioita.


Sivun alkuun