Mustand: sisu ei ole veel tehniliselt ega keeleliselt täielikult kontrollitud ega toimetatud.

Peatüki vaade

Linux/Unix/macOS käsurea kiirõpik

Praegu loed peatükki Kataloogid ja failid, mis kuulub osasse Osa I: Esimesed sammud.

Kataloogid ja failid

Unix-laadsetes süsteemides on failide ja kaustadega töötamine üks põhioskusi.

Loogika

Failidega töötamisel on hea hoida meeles lihtsat rütmi: leia õige koht, tee muudatus, kontrolli tulemus üle. See peatükk on seotud peaaegu kõigi teistega, sest enamik Linuxi tööst toimub lõpuks failide ja kataloogidega.

Liikumine failisüsteemis


pwd
ls
cd kaust
cd ..

Enne kui lood kaustu

Enne käsku mkdir tasub teha kaks lihtsat kontrolli:


pwd
ls

Need kaks küsimust on:

  1. kus ma praegu olen
  2. kas see on koht, kus ma tahan päriselt muudatusi teha

Alguses on hea harjutada oma kodukataloogis või selle all olevas eraldi harjutuskaustas. Nii on lihtsam vältida seda, et teed muudatusi mõnes päris projektis või süsteemi tähtsas kohas.

Väga hea praktiline nimi sellise kausta jaoks on näiteks proov, harjutus või faili-naited:


mkdir proov
cd proov
pwd

või:


mkdir faili-naited
cd faili-naited

Kui need nimed on sul juba olemas, vali lihtsalt mõni teine uus nimi. Hiljem näed ka kuju ~/tmp, mis tähendab sinu kodukataloogi all olevat kausta tmp.

Teed: proov, ./proov ja ~/proov

Need kolm kuju on sugulased, aga mitte päris sama asi.

  • proov tähendab kausta nimega proov siin samas praeguses kataloogis
  • ./proov tähendab täpselt sama, aga ütleb selle veel selgemalt välja
  • ~/proov tähendab kausta proov sinu kodukataloogi all

Algaja jaoks on sageli kõige lihtsam alustada kujuga proov või ./proov, sest siis on seos käsuga pwd kohe nähtav.

Mida tähele panna

  • rm kustutab faili ilma prügikastita
  • mv võib nii ümber nimetada kui ka faili teise kohta liigutada
  • cd ~ viib kodukataloogi

Esimesed käsud

  • pwd näitab, kus sa oled
  • ls näitab, mida siin leidub. Nimi tuleb sõnast list.
  • cd kaust liigutab sind teise kausta. Nimi tuleb väljendist change directory.
  • mkdir kaust loob uue kausta. Nimi tuleb väljendist make directory.
  • touch fail.txt loob tühja faili
  • cp allikas siht kopeerib faili või kausta. Nimi tuleb sõnast copy.
  • mv vana uus liigutab või nimetab ümber. Nimi tuleb sõnast move.
  • rm fail kustutab faili. Nimi tuleb sõnast remove.
  • rmdir kaust kustutab tühja kausta
  • sha256sum fail arvutab faili räsi Linuxis
  • shasum -a 256 fail arvutab faili räsi macOS-is
  • find . -name 'muster' otsib faile nime järgi

Samad käsud koos lisadega

  • ls -l näitab detailvaadet
  • ls -a näitab ka peidetud kirjeid
  • ls -la teeb mõlemat korraga
  • ls -A näitab peidetuid, aga jätab . ja .. välja
  • mkdir -p tee/kaust loob ka puuduva teekonna vahekaustad
  • cp -R kopeerib kataloogi rekursiivselt
  • rm -r kaust kustutab kausta koos sisuga rekursiivselt
  • find . -type f piirab otsingu tavaliste failidega
  • find . -type d piirab otsingu kataloogidega

Käivita need käsud

See näide õpetab järgmist loogikat:

  • kontrolli, kus sa oled
  • loo samasse kohta uus harjutuskaust
  • liigu selle sisse
  • loo fail ja kopeeri see
  • kontrolli tulemust

pwd
ls
mkdir proov
cd proov
mkdir failid
cd failid
touch esimene.txt
cp esimene.txt teine.txt
mkdir arhiiv
mv teine.txt arhiiv/
ls
ls arhiiv

Näide terminalis

Siin on sama loogika kujul, kus on näha prompt, käsk, väljund ja uus prompt:


vilo@macbook ~ % pwd
/Users/vilo
vilo@macbook ~ % ls
Desktop
Documents
Downloads
vilo@macbook ~ % mkdir proov
vilo@macbook ~ % cd proov
vilo@macbook proov % mkdir failid
vilo@macbook proov % cd failid
vilo@macbook failid % touch esimene.txt
vilo@macbook failid % cp esimene.txt teine.txt
vilo@macbook failid % mkdir arhiiv
vilo@macbook failid % mv teine.txt arhiiv/
vilo@macbook failid % ls
arhiiv
esimene.txt
vilo@macbook failid % ls arhiiv
teine.txt
vilo@macbook failid % 

Kui proov on juba olemas, siis saad selle asemel lihtsalt teha:


cd proov

Hiljem, kui ~ ja mkdir -p on juba selged, võib sama näite kirjutada ka lühemalt. Alguses on aga parem, kui iga samm on silmaga jälgitav.

touch loob faili või muudab ajatemplit

touch on hea näide käsust, mis võib teha nähtava muudatuse ilma midagi ekraanile kirjutamata.

Oluline loogika on selline:

  • kui faili veel ei ole, siis touch fail.txt loob tühja faili
  • kui fail on juba olemas, siis touch ei lisa sinna sisu
  • olemasoleva faili puhul uuendab touch faili ajatemplit, tavaliselt muutmisaega

Seepärast on see näide oluline:


touch tyhi.txt
cat tyhi.txt
ls -l tyhi.txt

Siin:

  • touch tyhi.txt töötab edukalt
  • cat tyhi.txt ei näita midagi, sest fail on tühi
  • ls -l tyhi.txt kinnitab, et fail on olemas

See tähendab, et “midagi ei ilmunud ekraanile” ei ole veel viga. Mõnikord ei ole käsul lihtsalt midagi näidata.

touch ja ls -t

Kuna touch muudab faili ajatemplit, võib see mõjutada ka käsku ls -t.

  • ls -t sorteerib failid aja järgi
  • uuem fail või äsja touch-itud fail liigub tavaliselt ettepoole
  • ls -lt näitab sama loogikat koos detailvaatega

Näide:


printf 'vana\n' > esimene.txt
sleep 1
printf 'uus\n' > teine.txt
ls -lt
touch esimene.txt
ls -lt

Tõenäoline tulemus on:

  • enne touch-i on teine.txt nimekirjas eespool
  • pärast touch esimene.txt võib esimene.txt minna ettepoole, kuigi faili sisu ei muutunud

See on hea meeldetuletus, et touch puudutab sageli aega, mitte sisu.

Kuvatõmmise lahtilugemine: ls, ls -a ja ls -al

Kuvatõmmise lugemisel ei piisa ainult pildist. Oluline on ka lahti öelda, mis seal samm-sammult juhtus.

Terminali näide, kus võrreldakse käske `ls`, `ls -a` ja `ls -al` ning nähakse ka olukorda, kus `mkdir tmp` annab teate `File exists`.
Terminali näide, kus võrreldakse käske ls, ls -a ja ls -al ning nähakse ka olukorda, kus mkdir tmp annab teate File exists.

Sellise akna puhul tasub tähele panna näiteks seda järjekorda:

  1. prompt muudeti lühemaks, et pildil oleks vähem isiklikku infot ja rohkem ruumi käsule endale
  2. pwd näitas, et kasutaja oli kodukataloogis, näiteks /Users/vilo
  3. mkdir tmp proovis luua kausta nimega tmp, aga sai teate File exists, mis tähendab, et see kaust oli juba olemas
  4. cd tmp liikus olemasoleva kausta sisse ja prompt muutus kujule ~/tmp %
  5. ls näitas ainult tavalist nähtavat sisu, selles näites faili words.txt
  6. ls -a näitas lisaks ka peidetud kirjeid . ja ..
  7. ls -al näitas sama sisu pika detailvaatena koos õiguste, omaniku, suuruse ja ajaga

Olulised tähelepanekud sellest samast pildist on:

  • . tähendab praegust kausta
  • .. tähendab ülemkausta
  • ls ja ls -a ei näita sama pilti
  • mkdir võib ebaõnnestuda täiesti mõistlikul põhjusel, näiteks siis, kui kaust on juba olemas

rm kustutab vaikselt

rm on veel üks tähtis näide käsust, mis edukal juhul sageli midagi ei kuva.

See tähendab:

  • rm fail.txt kustutab faili
  • kui kõik õnnestub, siis uut teadet ei tule
  • tavaliselt näed lihtsalt järgmist käsuviipa

Näide:


printf 'ajutine\n' > proov.txt
rm proov.txt
ls -l proov.txt

Siin:

  • rm proov.txt võib töötada täiesti vaikselt
  • alles järgmine käsk näitab, et faili enam ei ole

See on seotud varasema põhireegliga: kui käsul ei ole midagi näidata, siis ta ei näita midagi, isegi siis, kui ta töötas edukalt.

Miks rm ei kustuta kataloogi

Tavaline rm on mõeldud failide eemaldamiseks.

Kui proovid kustutada kataloogi nii:


mkdir testkaust
rm testkaust

siis saad tavaliselt veateate, sest kataloog ei ole tavaline fail.

See on hea kaitsekiht: süsteem ei lase kataloogi vaikimisi sama lihtsalt eemaldada nagu üksikut faili.

Kuidas kustutada tühi kataloog

Kõige ohutum viis on:

  1. kustuta vajadusel failid eraldi
  2. kustuta tühi kataloog käsuga rmdir

Näide:


mkdir -p naide/arhiiv
printf 'sisu\n' > naide/arhiiv/fail.txt
rm naide/arhiiv/fail.txt
rmdir naide/arhiiv

rmdir töötab ainult siis, kui kataloog on tühi. See on algajale väga hea, sest vähendab juhusliku liigse kustutamise riski.

rm -r ja rm -rf

Kui tahad kustutada kataloogi koos sisuga, kasutatakse rekursiivset kustutamist:


rm -r vana-kaust

Oluline loogika:

  • -r tähendab, et käsk läheb kataloogi sisse ja eemaldab selle sisu rekursiivselt
  • see puudutab korraga paljusid faile ja alamkatalooge

Veel agressiivsem kuju on:


rm -rf vana-kaust

Siin:

  • -r kustutab rekursiivselt
  • -f tähendab force, ehk ära küsi kinnitust ja ära peatu väiksemate hoiatuste juures

See on põhjus, miks rm -rf on ohtlik:

  • see võib eemaldada väga palju korraga
  • tavaliselt ei ole prügikasti ega tagasivõtmise nuppu
  • vale tee või vale kataloog võib teha suure kahju

Kas siin on turvavõrk

Üldreegel on: käsureal ei ole vaikimisi Finderi või Windows Exploreri moodi prügikasti.

See tähendab:

  • rm ei vii faili prügikasti
  • rm -r ei vii kataloogi prügikasti
  • kui kustutamine õnnestub, siis failid on tavakasutuse mõttes kohe läinud

Mõnes süsteemis võib olla alias nagu rm -i, mis küsib üle, aga sellele ei tasu kindlalt lootma jääda. Parem harjumus on:

  • kontrolli enne pwd
  • vaata üle ls
  • alles siis kasuta rm
  • eelista kataloogi eemaldamisel alguses rmdir, kui see on võimalik

Hea algaja rusikareegel on:

  • üksik fail: rm fail.txt
  • tühi kataloog: rmdir kaust
  • kataloog koos sisuga: rm -r kaust
  • rm -rf kasuta ainult siis, kui saad täpselt aru, miks seda vajad

ls, ls -a ja ls -la

See on üks esimesi kohti, kus algaja näeb, et terminal ja graafiline failivaade ei näita alati täpselt sama asja.

Põhireegel on lihtne:

  • ls näitab tavalist kaustasisu
  • ls -a näitab ka peidetud kirjeid
  • ls -la näitab peidetud kirjeid ja lisab detailvaate

Oluline detail:

  • -a tähendab all
  • see näitab ka kirjeid . ja ..
  • . tähendab praegust kataloogi
  • .. tähendab ülemkataloogi

Sageli on mugavam kasutada ka:

  • ls -A

See näitab peidetud faile, aga jätab . ja .. välja.

Näide:


mkdir -p ~/tmp/peidetud-naide
cd ~/tmp/peidetud-naide
touch tavaline.txt .peidetud.txt
mkdir .seaded
ls
ls -a
ls -la
ls -A

Tüüpiline tulemus on selline:

  • ls näitab ainult tavaline.txt
  • ls -a näitab . .. .peidetud.txt .seaded tavaline.txt
  • ls -la näitab sama detailse õiguste- ja omanikuväljaga
Terminali näide, kus kõigepealt võrreldakse käske `ls`, `ls -a` ja `ls -al`, seejärel luuakse peidetud fail `.peidetud.txt` ja vaadatakse sama kausta sisu uuesti.
Terminali näide, kus kõigepealt võrreldakse käske ls, ls -a ja ls -al, seejärel luuakse peidetud fail .peidetud.txt ja vaadatakse sama kausta sisu uuesti.

Selle pildi lugemisel tasub jälgida seda järjekorda:

  1. ls näitab alguses ainult nähtavat faili tere.txt
  2. ls -a lisab nähtavale ka . ja ..
  3. ls -al näitab sama sisu pika detailvaatena
  4. käsk echo "näiteks seaded" > .peidetud.txt loob uue peidetud faili
  5. järgmine ls ei näita seda endiselt, sest nimi algab punktiga
  6. alles ls -a paljastab, et .peidetud.txt on päriselt olemas

See pilt õpetab hästi üht tähtsat asja: peidetud fail ei ole kadunud fail. Ta on olemas, aga tavaline ls ei näita teda vaikimisi.

Mis need punktiga algavad failid ja kataloogid on

Punktiga algavad nimed nagu:

  • .zshrc
  • .ssh
  • .git
  • .config

on tavaliselt peidetud faili- või katalooginimed.

See ei tähenda, et need oleksid “erilised failitüübid” või kuidagi paremini kaitstud. See on eelkõige kokkulepe:

  • kui nimi algab punktiga, siis paljud tööriistad ei näita seda vaikimisi
  • tavaliselt hoitakse seal seadeid, metaandmeid või kasutajakeskkonna konfiguratsiooni

Hea mõtteviis on:

  • tavalised tööfailid ei alga punktiga
  • seadistus- ja tööriistafailid algavad sageli punktiga

Kuidas neid shellis vaadata

Shellis on kõige tavalisemad võtted:


ls
ls -a
ls -la
ls -A

Kui tahad näha ainult punktiga algavaid nimesid käesolevas kaustas, siis üks lihtne võte on:


find . -maxdepth 1 -name '.*'

Kui tahad vaadata oma kodukataloogi peidetud seadistusfaile, siis on väga tavaline:


cd ~
ls -la

Just nii näed näiteks:

  • ~/.zshrc
  • ~/.ssh
  • ~/.gitconfig

Kuidas neid Finderis vaadata macOS-is

macOS Finder peidab punktiga algavad failid ja kaustad tavaliselt ära. See on ainult kuvamisreegel, mitte failide päris kadumine.

Kõige praktilisem töövoog on:

  1. ava sama kaust Finderis
  2. ava sama kaust Terminalis
  3. tee Terminalis väike muudatus
  4. vaata Finderist, mis muutus

Terminalist saad praeguse kausta Finderis avada nii:


open .
Finder ja Terminal sama kausta peal: Terminalis liigutakse kausta, avatakse sama koht käsuga `open .`, luuakse tühi fail `uus.txt`, kirjutatakse faili `teine.txt` üks rida ja võrreldakse siis tulemust nii Finderis kui ka terminalis.
Finder ja Terminal sama kausta peal: Terminalis liigutakse kausta, avatakse sama koht käsuga open ., luuakse tühi fail uus.txt, kirjutatakse faili teine.txt üks rida ja võrreldakse siis tulemust nii Finderis kui ka terminalis.

Selle pildi sees toimub samm-sammult järgmine:

  1. cd ~/uuskaust/pildid liigub kausta, mida tahetakse korraga vaadata nii Finderis kui ka Terminalis
  2. pwd kinnitab, et töökoht on õige
  3. open . avab selle sama kausta Finderis
  4. touch uus.txt loob tühja faili
  5. echo "siin on ka teksti\n" > teine.txt loob teise faili ja kirjutab sinna ühe rea
  6. ls ja ls -al näitavad terminalis, et mõlemad failid on olemas
  7. Finderi aknas on näha seesama tulemus graafilises vaates

See on algajale väga hea harjutus, sest siin on korraga näha, et Terminal ja Finder ei tööta eri maailmades. Nad näitavad sama kausta kahe erineva kasutajaliidese kaudu.

Finderis saad peidetud failide kuvamist lülitada klahvikombinatsiooniga:


Command-Shift-.

See tähendab:

  • kui peidetud failid olid peidus, siis need muutuvad nähtavaks
  • kui need olid nähtavad, siis need peidetakse uuesti ära

See on väga hea algaja harjutus, sest siis näed otse, kuidas näiteks .zshrc või .git kaust päriselt olemas on, kuigi Finder ei näita neid alati vaikimisi.

Miks see oluline on

See teema on seotud paljude järgmiste peatükkidega:

  • ~/.zshrc ja ~/.bashrc ilmuvad muutujate ja aliaste peatükis
  • ~/.ssh ilmub SSH peatükis
  • .git ilmub Git-i peatükis

Kui punktiga algavate nimede loogika on selge, siis muutuvad ka need peatükid palju arusaadavamaks.

Faili sisu võrdlemine räsi abil

Mõnikord tahad teada, kas kaks faili on sisult täpselt samad. Selleks saab kasutada krüptoräsi.

Levinud näited:

  • sha256sum fail.txt
  • shasum -a 256 fail.txt
  • md5sum fail.txt või md5 fail.txt, kui vajad ainult kiiret kontrolli

Kui kahe faili SHA-256 räsi on sama, siis on need praktilises mõttes sama sisuga.

Näide:


printf 'tere\n' > a.txt
cp a.txt b.txt
sha256sum a.txt b.txt

Kui muudad ühe faili sisu, muutub ka räsi:


printf 'juurde\n' >> b.txt
sha256sum a.txt b.txt

Räsi kasutatakse sageli:

  • failide võrdlemiseks
  • allalaaditud faili tervikluse kontrolliks
  • selleks, et näha, kas sisu on muutunud

Oluline märkus:

  • SHA-256 sobib hästi tervikluse kontrolliks
  • MD5 on vanem ja nõrgem, seega eelista SHA-256

Failide leidmine käsuga find

Kui ls näitab ainult käesoleva kausta sisu, siis find suudab otsida sügavamalt.

Näited:


find . -name '*.md'
find . -type f
find . -type d

find . -name '*.log'

Kui tulemused on õiged, siis alles seejärel:


find . -name '*.log' -delete

Viimane näide on võimas ja ohtlik. Enne -delete kasutamist tasub alati kõigepealt kontrollida, mida find päriselt leiab.

Kasulikud variandid:

  • find . -iname '*.jpg' tõstutundetu nimeotsing
  • find . -maxdepth 2 -type f piira sügavust
  • find . -size +10M otsi suuri faile
  • find . -type f -mtime -7 otsi viimase 7 päeva jooksul muudetud faile

Veel üks väga praktiline lühikuju on:


ls -lt | head

See aitab kiiresti näha, mis siin kaustas viimati muutus.

Kui tahad suuremaid faile:


find . -type f -size +100M

Kui tahad hiljuti muudetud faile:


find . -type f -mtime -7

Need on väga head “mis siin üldse toimub?” tüüpi esimesed kontrollkäsud.

Minitest

  1. Loo kaust harjutus.
  2. Loo sinna fail readme.txt.
  3. Tee failist koopia nimega readme.bak.
  4. Nimeta koopia ümber nimeks vana.txt.
  5. Loo kausta peidetud fail nimega .salajane.
  6. Võrdle käske ls ja ls -a.
  7. Arvuta kahe sama faili räsi ja võrdle tulemusi.
  8. Leia find abil kõik .txt failid oma harjutuskaustast.