Informatie opslaan

Filters zijn erg nuttig zodra je een ervaren gebruiker bent, maar ze hebben een klein probleem. Hoe sla je de informatie op? Er wordt beslist niet van je verwacht dat je elke keer dat je het programma gebruikt alles weer opnieuw intikt. Natuurlijk niet. Unix voorziet in bestanden en directory's.

Een directory is te vergelijken met een folder: het bevat stukken papier, of bestanden. Een grote folder kan zelfs andere folders bevatten, directory's kunnen zich binnen directory's bevinden. Onder Unix wordt de verzameling directory's en bestanden een bestandssysteem genoemd. In beginsel bestaat het bestandssysteem uit een directory, genaamd de "root" directory. Binnen deze directory bevinden zich meer directory's, en binnen die directory's bevinden zich bestanden en nog meer directory's. [1]

Elk bestand en iedere directory heeft een naam. Er is zowel een korte naam aan toegekend welke gelijk kan zijn aan de naam van een ander bestand of andere directory elders op het systeem, als een lange naam welke uniek is. Een korte naam voor een bestand kan bijvoorbeeld joe zijn, met als volledige naam /home/larry/joe. De volledige naam wordt gewoonlijk het directorypad genoemd. Het directorypad kan in een reeks directory's worden opgesplitst. Zo wordt bijvoorbeeld /home/larry/joe gelezen als:

Tabel 5-1. /home/larry/joe

/De eerste slash geeft de rootdirectory aan
home/Dit duidt op de directory met de naam home. Het bevindt zich binnen de rootdirectory.
larry/Dit is de directory larry, die zich binnen home bevindt.
joejoe komt in larry voor. Een pad zou kunnen verwijzen naar een directory of een bestandsnaam, dus dat geldt ook voor joe. Alle items voor de korte naam moeten directory's zijn.

Een makkelijke manier om dit te visualiseren is een boomdiagram. Kijk voor een diagram van een typisch Linux-systeem naar Figuur 5-1. Dit diagram is niet compleet, een volledig Linux systeem bestaat uit meer dan 8000 bestanden! en het toont slechts een paar van de standaarddirectory's. Dus er kunnen wat directory's in het diagram zijn getekend die zich niet op je systeem bevinden, en op je systeem bevinden zich vrijwel zeker directory's die hier niet zijn weergegeven.

Figuur 5-1. Een typisch (ingekorte) Unix directorystructuur

Directory's bekijken met ls

Nu je weet dat er bestanden en directory's bestaan, moet er een manier zijn om ze te manipuleren. Die is er inderdaad. De opdracht ls is één van de belangrijkste. Het geeft een lijst met bestanden. Probeer je ls als opdracht, dan zie je:


/home/larry# ls
/home/larry# 

Dat klopt, je ziet niets. Unix is met opzet beknopt: het geeft je niets, zelfs geen "no files" als er geen bestanden zijn. Dus het gebrek aan uitvoer was voor ls de manier om aan te geven dat het geen bestanden vond.

Maar ik zei zojuist dat er wel 8000 of meer bestanden zouden kunnen zijn: waar zijn die dan? We hebben hier te maken met het concept "huidige" directory. Aan je prompt kun je zien dat je huidige directory /home/larry is, waarin zich geen bestanden bevinden. Probeer de rootdirectory, als je een bestandenlijst wilt van een actievere directory:


/home/larry#  ls /
bin      etc      install  mnt      root     user     var
dev      home     lib      proc     tmp      usr      vmlinux
/home/larry# 

In bovenstaande opdracht "ls", is de directory "/" een parameter. Het eerste woord van de opdracht is de opdrachtnaam, en alles wat daarna komt is een parameter. Parameters passen gewoonlijk aan waarop het programma werkt---voor ls geven de parameters aan van welke directory je een lijst wilt. Sommige opdrachten kennen speciale parameters genaamd opties of switches. Probeer eens:


/home/larry# ls -F / 
bin/      etc/      install/  mnt/      root/     user/     var@
dev/      home/     lib/      proc/     tmp/      usr/      vmlinux
/home/larry# 

De -F is een optie. Een optie is een speciaal soort parameter welke begint met een koppelteken en wijzigt hoe het programma wordt uitgevoerd, maar niet waarop het programma wordt uitgevoerd. Voor ls, is -F een optie waarmee je kunt zien welke items directory's zijn, welke de speciale bestanden, welke programma's zijn en welke de normale bestanden. Alles met een slash is een directory. We zullen later verder op de features van ls ingaan. Het is een wonderbaarlijk complex programma!

Er zijn hier nu twee lessen uit te leren. Ten eerste moet je leren wat ls doet. Probeer een paar andere directory's die worden getoond in Figuur 5-1, en kijk wat hierin staat. Natuurlijk zullen een aantal leeg zijn, en in sommige staan heel, veel bestanden. Ik raad je ls zowel met als zonder de optie -F uit te proberen. Bijvoorbeeld ls /usr/local geeft te zien:


/home/larry# ls /usr/local
archives  bin       emacs     etc       ka9q      lib       tcl

/home/larry# 

De tweede les is wat algemener. Veel Unix-opdrachten zijn net als ls. Ze hebben opties die gewoonlijk uit één teken bestaan voorafgegaan door een streepje, en ze hebben parameters. In tegenstelling tot ls vereisen sommige opdrachten bepaalde parameters en/of opties. Om te laten zien hoe opdrachten er over het algemeen uitzien, maken we gebruik van de volgende vorm:

ls [-aRF] [directory]

Voortaan zal ik dergelijke opdrachtsjablonen gebruiken voordat ik een nieuwe opdracht introduceer. Het eerste woord is de opdracht (in dit geval ls). Volgend op de opdracht staan alle parameters. Optionele parameters staan tussen vierkante haken ("[" en "]"). Meta-variabelen worden benadrukt; dit zijn woorden die de plaats innemen van feitelijke parameters. (Hierboven zie je bijvoorbeeld directory, dat moet worden vervangen door de naam van een echte directory.)

Een optie is een speciaal geval. Opties worden omsloten door vierkante haken, maar je kunt elk daarvan nemen zonder ze allemaal te gebruiken. Als bijvoorbeeld bij een opdracht als ls drie opties worden gegeven, dan heb je acht verschillende manieren om de opdracht uit te voeren: met of zonder elk van de opties. (Contrast ls -R met ls -F).

De huidige directory en cd

pwd

Het gebruik van directory's zou omslachtig worden als je elke keer dat je een directory wilde benaderen het volledige pad in zou moeten tikken. In plaats daarvan kennen Unix-shells een feature genaamd de "huidige", "actieve", of "werk" directory. In je huidige setup zal de directory naar alle waarschijnlijkheid in je prompt worden weergegeven: /home/larry. Probeer als dit niet zo is de opdracht pwd, voor present working directory. (Soms toont de prompt de naam van de machine. Dit is slechts alleen dan van nut in een netwerkomgeving met veel verschillende machines.)


mousehouse> pwd
/home/larry
mousehouse> 

cd [directory]

Zoals je kunt zien, geeft pwd aan wat je huidige directory[2] is; een zeer simpele opdracht. De meeste opdrachten zijn standaard van toepassing op de huidige directory. De opdracht ls toont zonder parameters bijvoorbeeld de inhoud van de huidige directory. We kunnen onze huidige directory wijzigen met cd Probeer bijvoorbeeld eens:


/home/larry# cd /home
/home# ls -F
larry/     sam/       shutdown/  steve/     user1/
/home# 

Als je de optionele parameter directory achterwege laat, keer je terug naar je homedirectory of oorspronkelijke directory. Anders brengt cd je naar de opgegeven directory. Nog een voorbeeld:


/home# cd
/home/larry# cd /
/# cd home
/home# cd /usr
/usr# cd local/bin
/usr/local/bin# 

Zoals je kunt zien, kan cd overweg met absolute en met relatieve adressen. Een absoluut pad begint met een / en specificeert alle directory's voorafgaand aan die je wilt. Een relatief pad staat in relatie met je huidige directory. In bovenstaand voorbeeld, voerde ik een relatieve verplaatsing uit naar local/bin toen ik me bevond in /usr. local is een directory onder usr en bin is een directory onder local! (cd home was ook een relatieve directory wijziging.)

Er bestaan twee directory's die alleen voor relatieve padnamen worden gebruikt: "." en ".." . De directory "." verwijst naar de huidige directory en ".." is de parent directory. Dit zijn "shortcut" directory's. Ze komen in elke directory voor, maar passen niet echt in het "folder in een folder" concept. Zelfs de rootdirectory heeft een parentdirectory, het is zijn eigen parent!

Het bestand ./chapter-1 wordt in de huidige directory het bestand met de naam chapter-1 genoemd. Zo nu en dan moet je de "./" voor een aantal opdrachten zetten, willen ze werken, alhoewel dit zeldzaam is. In de meeste gevallen zullen ./chapter-1 en chapter-1 identiek zijn.

De directory ".." is handig wanneer een stapje terug moet worden gegaan in de directorystructuur:


/usr/local/bin# cd ..
/usr/local# ls -F
archives/  bin/       emacs@     etc/       ka9q/      lib/       tcl@
/usr/local# ls -F ../src
cweb/      linux/     xmris/
/usr/local#

In dit voorbeeld ging ik naar de parentdirectory door gebruik te maken van de opdracht cd .., en gaf ik de opdracht voor het tonen van een directorylisting van /usr/src vanuit /usr/local met ../src. Als ik in /home/larry zou zijn geweest, zou het typen van ls -F ../src me niet verder hebben geholpen!

De directory ~ is een alias voor je homedirectory:


/usr/local# ls -F ~/
/usr/local# 

Je kunt in één oogopslag zien dat je niet in je homedirectory staat! ~ krijgt meer betekenis zodra we meer leren over het manipuleren van bestanden.

Directory's aanmaken en verwijderen

mkdir directory1 [directory 2 ... directoryN]

Het aanmaken van eigen directory's is uiterst simpel onder Unix en het kan een handig organisatiehulpmiddel zijn. Gebruik voor het aanmaken van een nieuwe directory de opdracht mkdir. Natuurlijk staat mkdir voor make directory. Laten we met een klein voorbeeld bekijken hoe dit werkt:


/home/larry# ls -F
/home/larry# mkdir report-1993
/home/larry# ls -F
report-1993/
/home/larry# cd report-1993
/home/larry/report-1993# 

mkdir accepteert meer dan één parameter, elke parameter interpreterend als een ander aan te maken directory. Je kunt zowel de volledige padnaam als een relatieve padnaam opgeven; report-1993 in bovenstaand voorbeeld is een relatieve padnaam.


/home/larry/report-1993# mkdir /home/larry/report-1993/chap1 /report-1993/chap2
/home/larry/report-1993# ls -F
chap1/  chap2/
/home/larry/report-1993# 

rmdir directory1 [directory2 ... directoryN]

Het tegenovergestelde van mkdir is rmdir (remove directory. . Een voorbeeld van rmdir is:


/home/larry/report-1993# rmdir chap1 chap3
rmdir: chap3: No such file or directory
/home/larry/report-1993# ls -F
chap2/
/home/larry/report-1993# cd ..
/home/larry# rmdir report-1993
rmdir: report-1993: Directory not empty
/home/larry# 

Zoals je kunt zien, zal rmdir weigeren een niet bestaande directory te verwijderen, evenmin een directory met inhoud. (Denk eraan, report-1993 heeft een subdirectory chap2!) Wat zou er trouwens gebeuren als je je huidige directory probeert te verwijderen? Laten we hier eens achter proberen te komen:


/home/larry# cd report-1993
/home/larry/report-1993# ls -F
chap2/
/home/larry/report-1993# rmdir chap2
/home/larry/report-1993# rmdir .
rmdir: .: Operation not permitted
/home/larry/report-1993# 

Een andere situatie die je zou kunnen overwegen is wat er gebeurt als je probeert de parent van je huidige directory te verwijderen. Het komt er op neer dat dit geen probleem is aangezien de parent van je huidige directory niet leeg is, dus niet kan worden verwijderd!

Noten

[1]

Mogelijk is er een limiet aan hoe "diep" het bestandssysteem kan gaan. (Ik heb deze limiet nog nooit bereikt, directory's kunnen makkelijk 10 niveaus diep zijn.)

[2]

Je ziet beide termen in dit boek: huidige directory of werkdirectory. Ik geef de voorkeur aan "huidige werkdirectory", alhoewel de andere vorm soms zal worden gebruikt.