Terug naar inhoudsopgave

Directories en bestanden

Over aanhalingstekens

Soms is het nodig om argumenten voor een commando te omgeven met aanhalingstekens. Daarvoor kunnen een aantal redenen zijn: het argument kan dezelfde term zijn als het commando, of het argument bevat "escape" tekens, die door Linux verkeerd zouden kunnen worden begrepen, of u wilt zoeken naar een speciale string. Argumenten voor commando's kunnen omgeven worden door dubbele ("arg") of door enkele aanhalingstekens ('arg').

In de meeste gevallen maakt het niet uit wat u gebruikt. Een kennelijke uitzondering is als het argument zelf aanhalingstekens bevat. Als we de volgende regel zouden invoeren, zou er een probleem ontstaan:

$ grep 'Croc's stuff' bookmarks.html

Het probleem is hier dat het commando grep (waarover later meer) zal proberen om Croc te gebruiken als argument in plaats van Croc's stuff . In dit geval gebruikt u dus dubbelel aanhalingstekens:

$ grep "Croc's stuff" bookmarks.html

Er zijn gevallen waarin de Linux Shell (de Command-Line Interpreter) speciale betekenis hecht aan bepaalde tekens, zoals het dollarteken $. In dat soort gevallen worden enkele aanhalingstekens aanbevolen.

In het algemeen kunt u de volgende regels gebruiken:

  1. Als een commando niet werkt met een argument zonder aanhalingstekens, zet het dan tussen aanhalingstekens (").
  2. Als dat ook niet werkt, gebruik dan enkele aanhalingstekens (').
  3. Als dat nog steeds niet werkt, "escape" dan bepaalde speciale tekens (zoals $, *, &) door ze vooraf te laten gaan door een slash teken (\).
  4. Als ook dat niet werkt, zoek dan een Linux guru die u verder kan helpen.

Tonen van directories met `ls'

Nu u hopenlijk iets afweet van de basis commando's gaan we naar iets bruikbaarders. Het commando ls geeft in Linux opdracht om een directory te laten zien. Als er geen directory wordt aangegeven, wordt de huidige directory getoond (waarschijnlijk uw "home" directory). Als u alleen de prompt weer te zien krijgt, is de directory kennelijk leeg. Of het moest zijn, dat er bepaalde "verborgen" bestanden in staan. De namen daarvan beginnen met een punt (.). Het is verstandig om dergelijke namen niet te gebruiken, tenzij u de bestanden bewust onzichtbaar wilt maken.

Laten we aannemen dat er enkele bestanden in uw directory staan, hoewel u die niet zelf hebt aangemaakt. Naar alle waarschijnlijkheid staan er ook een stel verborgen bestanden in. We gebruiken het ls commando:

$ls

eenfile      prog.c      index.html    volgende
$
De echte uitvoer van de lijst kan verschillen, maar in essentie zal het hier op lijken. Dat is prima, maar het geeft niet veel info over de bestanden. Ook kunnen we op deze manier niet weten of "eenfile" en "volgende" bestanden zijn of directories. De meeste namen met een suffix (zoals "prog.c" en "index.html") zullen wel bestanden zijn. De simpelste manier om dat uit te vinden is de optie -l te gebruiken.
 

$ ls -l

-rw-------   1 jacco  student  2379 Jun 20 13:14 eenfile
-rw-------   1 jacco  student  2382 Jun 20 13:14 prog.c 
-rw----r--   1 jacco  student  1262 Jun 25 11:27 index.html
drwx------   4 jacco  student   512 Jun 24 13:52 volgende
$
Hier staat meer bruikbare info in. Over de "bevoegdheden" lijst hebben we het later (het -rw------- stukje), maar merk hier alvast op dat een directory een "d" als eerste teken heeft in plaats van een "-". We kunnen hier ook zien wie de eigenaar is van deze bestanden (een zekere jacco in dit geval, hoewel u dat normaliter zelf zult zijn), alsmede de namen en de omvang ervan en de datum waarop de bestanden voor het laatst werden gewijzigd.

Er is nog een (misschien duidelijker) manier om directories te onderkennen. U kunt ook de optie -F gebruiken bij het commando ls, waarna alle directories zullen verschijnen gevolgd door een "/". Bijvoorbeeld:

$ ls -F

eenfile    prog.c     index.html   volgende/
$
Maar we hebben nog steeds geen verborgen bestanden gezien, dus hoe laten we die tevoorschijn komen? Simpel door het gebruik van de -a optie. U kunt opties combineren en hier is dat aangewezen. De optie -a alleen helpt niet veel, maar in combinatie met -l krijgt u een mooi overzicht.

$ ls -al

drwx--x--x  22 jacco  student   2048 Jun 25 11:57 .
drwxr-xr-x 163 root   staf      4096 Jun 22 09:19 ..
-rw-------   1 jacco  student  27630 Feb  4 14:01 .hithere
-rw-------   1 jacco  student   2379 Jun 20 13:14 somefile
-rw-------   1 jacco  student   2382 Jun 20 13:14 prog.c
-rw----r--   1 jacco  student   1262 Jun 25 11:27 index.html
drwx------   4 jacco  student    512 Jun 24 13:52 next
$
We hebben ze zichtbaar gemaakt! Maar wat zijn de verborgen directories "." en ".."? En wie is die "root"?
Hoewel "." verschillende dingen kan betekenen, slaat het in dit geval op de "huidige" actieve directory. ".." slaat op de aanpalende hogere directory, waarvan de huidige directory een subdirectory is. En wat "root" betreft: dat is een directory van de beheerder van de computer.

Het aanmaken en veranderen van directories

We beginnen met het aanmaken van een eigen directory. Daarvoor gebruikt u het mkdir commando.

$ mkdir vanalles nieuw
$

Hierboven werden er zelfs twee directories aangemaakt. U kunt namelijk net zoveel directories in een keer aanmaken als u wilt. Met het commando ls kunt u beide directories te zien krijgen. Maar hoe kunnen we er in komen? Heel simpel. Middels het commando:

$ cd vanalles
$

Het commando cd (change directory) maakt "vanalles" tot de actieve directory. Opeens herinnert u zich, dat u eigenlijk naar de directory "nieuw" wilde gaan. Hoe komt u terug? Er zijn twee manieren. U kunt eerst terug naar de "aanpalende" directory ('. .') en daarna met cd naar de directory "nieuw".

$ cd ..
$ cd nieuw
$

Maar u kunt ook een relatieve padnaam invoeren om direct naar "nieuw" te gaan.

$ cd ../nieuw
$

Beetje uitgebreid weergegeven betekent het bovenstaande: 'ga naar de hogere directory en daarna naar de "nieuw" directory'.
 


En hoe moet ik nou naar een directory die niet in de hogere directory staat? Of wat moet ik doen als ik "verdwaald" raak en mijn weg naar mijn "home" directory niet meer kan vinden?

Twee goede vragen.
Ik beantwoord de tweede eerst, omdat dat het gemakkelijkst is. Als u ooit de weg kwijt bent op de computer, of gewoon terug wilt naar uw home directory, voert u gewoon cd in zonder verder iets.
Voor een antwoord op de eerste vraag moeten we een paar dingen veronderstellen. Laten we aannemen, dat u twee directories hebt buiten uw home directory (vanalles en nieuw b.v.). Als u nu in een directory bent binnen de "vanalles" directory is de vraag hoe u naar de "nieuw" directory komt. U zou dan twee keer naar de aanpalende directory kunnen gaan met "cd .." en daarna naar de "nieuw" directory. Maar er is ook een simpeler manier. U kunt ook het "~"(tilde) teken gebruiken. Dat teken wordt gebruikt als een voorvoegsel aan iemands gebruikersnaam, en wordt dan vertaald als (het pad naar) de home directory van die gebruiker.

$ cd ~/nieuw
$

Dit is dus een korte schrijfwijze voor het complete pad naar uw home directory. En het staat dus b.v. voor:

$ cd /users/cs/student1/gebruikersnaam/nieuw
$

Bovendien: als u ooit het spoor kwijtraakt naar waar u precies bent, kunt u altijd middels het commando pwd de huidige actieve directory opvragen.

U wilt er nog meer van weten? Neem een kijkje bij het bestandssysteem.
 

Aanmaken/Bewerken van bestanden

Een editor is een programma waarmee je de inhoud van bestanden kunt wijzigen. In de meeste gevallen zullen dat tekstbestanden zijn. Eigenlijk is een editor in dat geval dus een soort (eenvoudige) tekstverwerker.

In Linux (net als in UNIX) zijn er twee soorten editor, regel- en schermeditors. De verwerkingseenheid van een regeleditor is (zoals het woord zegt) een regel (= een string tekens afgesloten door een RETURN-teken). De populariteit van dit soort editors is miniem vergeleken bij de schermeditors.  In dat soort editors kun je de cursor over het hele scherm bewegen en bewerkingen en/of aanpassingen maken waar je maar wilt.

Twee van de meest gebruikte editors in Linux zijn vi en pico. Ik ga hier niet op hun respectieve werking in. Voor beginners beveel ik pico aan. Hij is eenvoudig te gebruiken, maar kan nog niet de helft van wat vi kan. Daar tegenover is vi zeer cryptisch en heeft het zoveel mogelijkheden, dat er geen mens is die ze allemaal uit zijn hoofd weet. Bovendien is vi niet erg gebruikersvriendelijk en rekent op vi-vriendelijke gebruikers. Als u iets fout doet wordt er alleen een boos piepje geproduceerd. En als u de gebruiksaanwijzing niet kent, zullen er heel wat van dat soort piepjes klinken!! Maar het gebruik ervan kan natuurlijk geleerd worden.

Voor het moment kunt u het beste volstaan met

$ pico filename
$

en gebruik maken van de ingebouwde uitleg om enkele bestanden aan te maken.
 

Over cat en tail

Als u enkele bestanden hebt aangemaakt kunnen we met de bovenstaande commando's de inhoud van die bestanden gaan bekijken.

Het eerste commando waarmee u de inhoud van een bestand kunt bekijken is cat. Dit commando heet zo, omdat het (bij toevoeging van meer bestandsnamen) de inhoud van bestanden aan elkaar kan koppelen (concateneren). Het is een simpel commando.

$cat somefile

Ik heb hierbij de uitvoer weggelaten, omdat die eenvoudig bestaat uit de inhoud van het bestand. De meeste bestanden bevatten meer tekst dan op 1 scherm weggezet kan worden. Vandaar dat cat soms tamelijk onoverzichtelijk kan werken. Hoewel je met Ctrl-S en Ctrl-Q de uitvoer kunt stilzetten en door laten gaan, gaat het meestal zo snel over het scherm, dat je alleen het eind van het bestand te zien krijgt. In dat geval kun je dus beter een editor gebruiken om het bestand te bekijken.

Oorspronkelijk is cat ontworpen om bestanden aan elkaar te koppelen. Meestal wilt u dan de gezamenlijke inhoud bewaren in een nieuw bestand. Dat gaat als volgt:

$cat file1 file2 > output

waarbij output het bestand is waarin de gekoppelde bestanden file1 en file2 worden bewaard. De volgorde waarin u de invoer bestanden neerzet zal de volgorde van verschijning bepalen in het uitvoerbestand. In dit geval zal file1 eerst verschijnen en daarna file2.

Een ander commando voor het bekijken van bestanden is tail. Daarmee kunt u de laatste paar regels van een bestand bekijken. Standaard zal tail de laatste 10 regels laten zien. U kunt dat echter aanpassen middels de opties "-" en "+".

$tail -3 somefile

laat dus de laatste drie regels zien van somefile, terwijl

$tail +6 somefile

alle regels laat zien vanaf regel 6 tot het eind.

Als u cat en tail tegelijk gebruikt, kunt u een foutmelding krijgen van het onderstaande type

tail: Can't open somefile

Als dat gebeurt, zorg dan dat u de bestandsnaam correct hebt gespeld en dat u in de juiste directory staat. Mogelijk ook hebt u helemaal geen bevoegdheid om het bestand te lezen.

`cp',`mv' en `rm', pas op!

De hier genoemde commando's zijn simpel, maar belangrijk. cp (copy) laat u een bestand copieren naar een ander bestand. Er zijn twee argumenten nodig: de namen van de bestanden, of de padnamen naar de bestanden. Een eenvoudig voorbeeld:

$cp hier daar

staat voor "copieer de inhoud van "hier" naar "daar".

De meeste bewerkingen die gelden voor cd kunt u ook gebruiken bij cp (en bij mv en rm). Om een bestand te copieren naar de hogere directory, gebruikt u het commando:

$cp somefile ..

In dit geval zal het aangemaakte bestand ook somefile heten. Normaliter geeft u de naam van het nieuwe bestand apart aan (zoals in het eerste voorbeeld van cp). Op die manier kan cp ook worden gebruikt om bestanden te hernoemen, waarbij u een copie van het oorspronkelijke bestand onder de oude naam bewaart. Kijk daarvoor nog even naar het eerste voorbeeld. Bestaat het bestand daar al voor we het cp commando gebruiken? Als dat zo is, bent u de oorspronkelijke inhoud ervan dus wel kwijt! Het commando cp overschrijft dat namelijk zonder verder vragen! Controleer de zaak dus eerst b.v. met het commando ls!

Nog een laatste opmerking. U kunt met cp meerdere bestanden tegelijk copieren. Echter kunt u de bestanden alleen copieren naar een reeds bestaande directory en kunt u ze onderweg ook niet hernoemen! Probeer het volgende maar eens:

$cp file1 file2 dir1(dit zou moeten werken)

of

$cp file1 file2 file3(dit zou een foutmelding moeten veroorzaken)

Het commando mv (move) lijkt heel erg op cp, behalve dat u het bestand zelf verplaatst zonder daarvan copieen te maken. Er zijn twee gevallen waarin mv gebruikt kan worden: om bestanden te hernoemen of om ze naar een andere locatie te brengen. Als u een bestand start hebt, dat u wilt hernoemen tot finish, kunt u het volgende intypen:

$mv start finish

Merk op dat na het succesvol draaien van dit commando er geen bestand met de naam start meer is. De inhoud ervan staat nu in het nieuw aangemaakte bestand finish.

Om een bestand te transporteren tussen directories doet u iets dergelijks. B.v. als u het bestand finish wilt verplaatsen naar de directory next, geeft u het volgende commando:

$mv finish next

Klaar. Als u nu een cd doet naar de next directory, zou u daar finish moeten kunnen vinden.

En dan nu het misschien gevaarlijkste commando tot dusver: rm (remove = verwijderen). Zoals de naam al aangeeft staat rm u toe bestanden en directories te wissen. Wees erg voorzichtig met rm, omdat het erg moeilijk is (en soms zelfs onmogelijk!) om verwijderde bestanden terug te halen. Er zijn echter een aantal opties om rm zo veilig mogelijk te maken. Ik zou ze gebruiken als ik u was.

Maar laten we eerst eens zonder opties een bestand verwijderen.

$rm finish

Weg. Compleet verdwenen. Gaat u maar kijken met ls. Het bestand is naar never-never-land!

Maar waar zijn al die opties dan, vraagt u? Laten we er een stel opvoeren. De eerste is de "-i" (= interactief) optie. Als u die gebruikt, zal rm eerst controleren of u het bestand echt wilt verwijderen. Dat is een erg verstandige voorzorg tegen het per ongeluk wissen van een bestand, dat u eigenlijk had willen houden. Een voorbeeld:

$rm -i file1 file2
rm: remove file1?n
rm: remove file2?y
$

Als u de y-toets aanraakt, zal rm dat opvatten als een bevestiging dat het bestand gewist kan worden. Typt u enige andere toets, dan zal rm het bestand niet verwijderen. In ons voorbeeld is file2 dus verwijderd, maar file1 niet.

Een andere optie is het omgekeerde van "-i", namelijk "-f" (staat voor 'force'). Met deze optie zal rm bestanden verwijderen zonder verder ook maar iets te vragen, zelfs als ze schrijfbescherming hebben (daarover hebben we het trouwens straks in het stukje over bestandsbevoegdheden, maar schrijfbescherming houdt in, dat u geen toestemming hebt om een bestand te veranderen).

Probeert u ook maar eens een directory te wissen middels rm. Dat werkt dus niet. Waarschijnlijk kreeg u een foutmelding als:

$rm volgende
rm: volgende is a directory
$

Om directories te verwijderen kunt u het rmdir commando gebruiken. Dat heeft als nadeel dat de directory eerst leeg moet zijn. Gelukkig kunnen we bij rm ook een andere optie gebruiken, die directories wel verwijdert. Zelfs inclusief de eventuele bestanden erin!

Wanneer u rm gebruikt met de optie "-r" (staat voor recursive) zal rm de directory-boom langsgaan en alle subdirectories en bestanden daarin wissen. Denk er goed om waar en wanneer u dit commando gebruikt. Als u het als 'root' gebruikt, kunt u er een compleet Linux-systeem in 1 keer mee wissen. En dan bent u dus echt alles kwijt!! ;-(
 

Wild-cards

Heel snel nog even melding van een stel speciale tekens, die vaak "wild-cards" worden genoemd, naar analogie van kaartspellen, waarbij de Joker voor elke andere kaart kan gelden. Deze speciale tekens worden gebruikt om te gelden als bestandsnamen of delen daarvan. Ze maken het eenvoudiger om bestanden of groepen daarvan aan te duiden.

Ons eerste wild-card (of meta-teken) is het vraagteken "?". Dat kan staan voor elk enkel teken.

$ls c?

Met dit commando vindt u alle betanden die namen hebben bestaande uit de letter "c" gevolgd door een enkel ander teken. U kunt ook meerdere vraagtekens gebruiken:

$ls c??

wat de namen laat zien van bestanden met een "c" gevolgd door twee andere tekens.

Het teken "*" (de asterisk) kan overeenkomen met een willekeurige serie tekens, inclusief een serie met de lengte 0 (een zogenaamde nul-string):

$ls c*

Hiermee vindt u alle bestandsnamen met een "c", ongeacht hoe lang de bestandsnaam is.

Een serie tekens ingesloten in teksthaken ("[" en "]") staat bekend als een "character-class". De betekenis daarvan is "kies elk enkele teken dat binnen de teksthaken staat". Bijvoorbeeld:

$ls c[12684xyz]

Dit commando toont alle bestandsnamen die beginnen met "c" en gevolgd worden door  "1" of "2" of "6" of "8" of "4" of "x" of "y" of "z".

Alle wild-cards kunnen ook gecombineerd worden om samen nieuwe argumenten te vormen. Ook gebruikte ik in de voorbeelden alleen ls. Maar u kunt natuurlijk ook elk ander commando gebruiken. Weest u daar echter voorzichtig mee. In het bijzonder met rm!!
 

Bevoegdheden

Elk bestand of elke directory op een Linux machine, heeft een eigenaar. Meestal degene die het bestand of de directory heeft aangemaakt. Die eigenaar kan dan verschillende bevoegdheden (of beschermingsmogelijkheden) toekennen, waarbij hij toegang tot directory of bestand mogelijk of onmogelijk maakt.

Voor elk bestand en elke directory zijn er drie klassen van gebruikers, waarmee rekening gehouden moet worden:
 

Owner       De Owner (eigenaar) is de gebruiker die het bestand aanmaakte.

Group       Een aantal gebruikers kan gecombineerd worden in een groep. 
            Zo is er ook een groepseigendom gekoppeld aan elk bestand en 
            elke directory.

Public      Alle andere gebruikers van de Linux machine. Dat wil zeggen: 
            iedereen die op de Linux computer een geldige gebruikersnaam  
            en wachtwoord heeft.

Elk bestand en elke directory heeft bovendien drie typen van toegankelijkheid, die aangeven wat er met directory of bestand gedaan kan worden. Omdat directories en bestanden van elkaar verschillen, verschilt ook de interpretatie van de bevoegdheden van elkaar. De geldende bevoegdheden zijn:
 
Read        Leesbevoegdheid. Wie leesbevoegdheid heeft kan de inhoud van het
            bestand bekijken.

            Als het over een directory gaat, kan betrokken gebruiker zien 
            welke bestanden er in de directory staan.

Write       Schrijfbevoegdheid. Wie dat heeft kan de inhoud van het bestand 
            veranderen.

            Als het om een directory gaat, kan de gebruiker de inhoud van
            de directory veranderen: nieuwe bestanden aanmaken en oude 
            verwijderen.

Execute     Uitvoeringsbevoegdheid. Wie dat heeft kan het betreffende
            programma op de Linux machine uitvoeren.

            Als het over een directory gaat kan de gebruiker naar
            die directory toegaan en daar vandaan copieren, als hij 
            tenminste ook leesbevoegdheid heeft voor die directory.
Door de drie typen bevoegdheden te combineren en de drie typen van gebruikers, kunnen we komen tot een totaal van 9 combinaties van bevoegdheden:
read    leesbevoegdheid voor de eigenaar (user)
write   schrijfbevoegdheid voor de eigenaar (user)          
execute uitvoeringsbevoegdheid voor de eigenaar (user) 
       
        read    leesbevoegdheid voor de groep
        write   schrijfbevoegdheid voor de groep
        execute uitvoeringsbevoegdheid voor de groep
       
                read    leesbevoegdheid voor het publiek (others)
                write   schrijfbevoegdheid voor het publiek (others)
                execute uitvoeringsbevoegdheid voor het publiek (others)
Normaliter worden deze negen bevoegdheden als volgt weergegeven:

rwxrwxrwx

Een ontbrekende bevoegdheid wordt aangegeven met een "-" en heet een "bescherming". Deze negen bevoegdheden, of beschermingen, staan tesamen bekend als de "modus" van een bestand of directory.
 

Het veranderen van bevoegdheden (chmod)

Met het commando chmod verandert (change mode) u dus de modus van een bestand of directory. De modus kan alleen verandert worden door de eigenaar (degene die het bestand heeft aangemaakt) of door de super-user, de root.

Het commando chmod kan op een aantal manieren gebruikt worden. We kijken naar twee ervan, te beginnen met "numerieke specificatie".  Deze manier combineert elke bevoegdheid met een 1 en elke bescherming met een 0 (binair systeem dus). Anders gezegd: "rw-r--r--" wordt op die manier "110100100". Lastig? Ik geef toe, dat binaire notatie enige gewenning vraagt. Maar het echt lastige is, dat de binaire notatie niet wordt gebruikt, maar in plaats daarvan de octale notatie. Dan wordt "110100100" vertaalt in "644".


Octale notatie?

Een klein stukje geschiedenis. Computers slaan informatie op in bits. Een bit kan twee waardes hebben: aan of uit, oftewel 0 of 1. Elke keer dat je een nieuwe bit toevoegt, heeft hij weer twee mogelijke waardes, zodat het aantal mogelijke waardes verdubbelt. Twee bits hebben 4 mogelijke waardes. Drie bits hebben 8 mogelijke waardes. Vier bits hebben er 16. Enzovoorts. Een lange reeks nullen en enen is lastig om te lezen. Simpeler is het om de serie te groeperen tot pakketjes die eenvoudiger te behandelen zijn. De eerste generatie computers in de vroege 60er jaren had geen speciale geheugen architectuur en het was gewoon om de bits te clusteren in groepjes van drie. Daardoor konden de mogelijke waardes (zie hierboven) worden weergegeven met de getallenset 0,1,2,3,4,5,6,7 (oftewel"octale notatie").

Kunt u het volgen? Zal wel niet. ;-) Ok ... u zou natuurlijk een boek kunnen gaan lezen over octale (en hexadecimale) notatie. Maar waarschijnlijk werkt het beter als u de conversiekaart hieronder gebruikt om uit te vinden welke octale notatie hoort bij welke modus.


 

Om de modus te veranderen in een getal telt u gewoon de cijfers op die horen bij de bevoegdheden die u wenst. Als u dus wilt dat het bestand lees- en schrijfbaar is door de eigenaar (uzelf dus), leesbaar voor de groep en leesbaar voor alle anderen, dan komt u tot de optelsom:

        
            400
            200
             40
              4
            ---
            644
Derhalve zal uw chmod commando er als volgt uitzien:

$chmod 644 ditbestand datbestand nogeenbestand
$

Nogmaals: u kunt de modus van vele bestanden in een keer veranderen (zoals hierboven) of elk bestand telkens apart.

Het gebruik van octale getallen om de modus aan te geven kan eerst wat ingewikkeld lijken, maar u gaat weldra de getallen kennen die horen bij de meest gebruikelijke bevoegdheden voor bestanden. Hier zijn een paar van de meest voorkomende:

644 is rw-r--r--
                 de eigenaar kan lezen en schrijven, de rest
                 alleen lezen.

755 is rwxr-xr-x
                 de eigenaar kan lezen, schrijven en uitvoeren 
                 de rest alleen lezen en uitvoeren.  
                 Voor een directory, is deze modus gelijk aan 
                 644

711 is rwx--x--x
                 eigenaar kan lezen, schrijven en uitvoeren, 
                 alle anderen alleen uitvoeren.

444 is r--r--r--
                 deze waarde betekent alleen lezen voor iedereen
De tweede manier van het aangeven van de modi is de "symbolische manier" en die is een beetje ingewikkelder. U hebt daarbij de keus te zeggen welke modus u wilt hebben, of aan te geven hoe u wilt dat de bestaande bevoegdheden worden veranderd. Hiervoor worden de volgende afkortingen gebruikt:
 
 u   user (eigenaar) bevoegdheden
 g   group bevoegdheden
 o   others (public) bevoegdheden
 a   all, dus user, group en others bevoegdheden
 =   kent een bevoegdheid absoluut toe
 +   voeg een bevoegdheid toe
 -   haal een bevoegdheid weg
De typen bevoegdheden zijn zoals gewoonlijk r, w en x.

Een van de redenen dat de symbolische manier complex kan zijn is, dat hij u vele manieren verschaft om een en hetzelfde te doen. Bijvoorbeeld als we een lees/schrijf bevoegdheid willen toekennen aan de gebruiker, leesbevoegdheid voor de groep en idem voor alle anderen kan dat als volgt:

$chmod a=r,u+w somefile
$

of

$chmod u=rw,go=r somefile
$

Kijkt u maar eens rustig en probeer uit te vinden wat elke symbolische aanduiding doet. Merk daarbij op, dat "a=r" leesbevoegdheid verleent aan iedereen en dat "u+w" daar voor de gebruiker dus schrijfbevoegdheid aan toevoegt.

De nieuwe modus die u wenst moet voor chmod als enkel argument verschijnen. Dat wil zeggen dat er geen enkele spatie in mag zitten. Als er dus meer dan een verandering wordt aangegeven, worden die gescheiden door komma's en niet door spaties, hoewel dat in Linux (UNIX) niet echt gebruikelijk is.

Hieronder is een voorbeeld van het veranderen van de huidige modus in plaats van het opgeven van een compleet nieuwe modus.Als de directory een aantal bestanden bevat die alreeds lees-, schrijf- en uitvoerbaar zijn voor iedereen:

$ls -l

-rwxrwxrwx   1 jacco  student  1045 Mar 18 13:35 ditbestand
-rwxrwxrwx   1 jacco  student 11925 Mar  6 16:33 datbestand 
-rwxrwxrwx   1 jacco  student  1458 Jun 17 13:07 nogeenbestand 
$
en we willen weer lees/schrijfbevoegdheid voor de gebruiker, leesbevoegdheid voor de groep en idem voor alle anderen, kunnen we simpel de schrijfbevoegdheid voor group en others verwijderen:

$chmod go-w ditbestand datbestand nogeenbestand
$ls -l

-rwxr-xr-x   1 jacco  student  1045 Mar 18 13:35 ditbestand
-rwxr-xr-x   1 jacco  student 11925 Mar  6 16:33 datbestand
-rwxr-xr-x   1 jacco  student  1458 Jun 17 13:07 nogeenbestand
$
Nog een voorbeeld: als u wilt dat een bestand uitvoerbaar is voor iedereen, maar u wilt verder de lees/schrijfbevoegdheden laten als ze zijn:

$chmod a+x file
$

Als u geen gebruiker, groep of anderen aangeven, wordt aangenomen dat u iedereen bedoelt. Dus:
 

$chmod +x file
$

doet precies hetzelfde als het vorige voorbeeld.

Het veranderen van modi kan lastig zijn, en bovendien weinig vruchtbaar. De meest belangrijke uitzondering zou zijn als u begint met het maken van homepages. Dan is het nodig de modi voor bepaalde directories en bestanden te veranderen zodat ze leesbaar zijn door iedereen (waaronder natuurlijk de webbrowser).

Tenslotte: als u om welke reden ook ooit de aanmaakdata van bepaalde bestanden wilt veranderen in de huidige datum/tijd, dan kunt u dat doen met het touch commando. Het is ook mogelijk de tijd op te geven. Zie daarvoor de uitleg bij touch, middels het commando man touch.

Beheer van bestandskoppelingen

Waarschijnlijk zult u deze informatie nooit voor persoonlijk gebruik nodig hebben, maar er staan toch bruikbare dingen in.

Koppelingen geven u de mogelijkheid een enkel bestand meerdere namen te geven. Bestanden wordt in het bestandssysteem eigenlijk onderscheiden aan de hand van hun inode nummer. Dat is een uniek identificatiemiddel voor elk bestand. Een directory is daarbij eigenlijk een lijst van inode nummers met de bijbehorende bestandsnamen. Elke bestandsnaam in een directory is een koppeling naar een enkele inode. Het commando ln wordt gebruikt om meer dan een koppeling te maken voor een enkel bestand. Laten we zeggen dan u het bestand onzin in een directory hebt staan. Middels het commando ls -i kunnen we het inode nummer voor dat bestand zichtbaar maken.

$ ls -i onzin
22192 onzin
$

Hier heeft het bestand onzin een inode nummer van 22192 in het bestandssysteem. We kunnen een extra koppeling maken naar  onzin, namelijk larie:

$ ln onzin larie

Met ls -i kunnen we zien dat de twee bestanden hetzelfde inode nummer hebben.

$ ls -i onzin larie
22192 larie 22192 onzin
$

Met andere woorden: middels hetzij onzin, hetzij larie benaderen we hetzelfde bestand. Als u veranderingen maakt in onzin, zullen die veranderingen ook in larie gemaakt worden. Bij alle bewerkingen slaan onzin en larie op hetzelfde bestand.

Deze koppelingen worden aangeduid als harde (of echte) koppelingen omdat ze een directe koppeling maken naar een inode. Merk op dat u alleen dergelijke koppelingen kunt maken in hetzelfde bestandssysteem. Symbolische koppelingen (zie hieronder) hebben die beperking niet.

Als u een bestand verwijdert met het commando rm, verwijdert u feitelijk alleen een koppeling naar dat bestand. Als u het commando gebruikt:

$ rm onzin

wordt alleen de koppeling met de naam onzin verwijderd. De koppeling larie zal nog steeds bestaan. Een bestand is ook alleen echt van de computer verwijderd als er geen koppelingen naar dat bestand meer bestaan. Normaliter heeft een bestand slechts een koppeling. Het commando rm zal het bestand derhalve geheel verwijderen. Als een bestand echter meerdere koppelingen heeft, zal rm telkens slechts een koppeling verwijderen. Teneinde het bestand helemaal te verwijderen, dient u alle koppelingen naar het bestand te wissen.

Het commando ls -l zal het aantal koppelingen naar een bestand (naast andere informatie) laten zien.

$ ls -l onzin larie
-rw-r--r-- 2 root root 12 Aug 5 16:51 larie
-rw-r--r-- 2 root root 12 Aug 5 16:50 onzin
$

De tweede kolom in de lijst, "2", geeft het aantal koppelingen naar het bestand aan.

Zoals gezegd is een directory feitelijk alleen een bestand met informatie over de koppelingen naar inodes. Bovendien heeft elke directory twee harde (echte) koppelingen, namelijk "." (een koppeling naar zichzelf) en ".." (een koppeling naar de hogere directory). In de root directory (/) verwijst echter de koppeling ".." alleen naar de directory zelf ('/'). Er is immers geen hogere directory dan de root directory.

Symbolische koppelingen zijn een ander soort koppelingen, enigszins anders dan de harde (echte) koppelingen. Een symbolische koppelingen geeft u de mogelijkheid een bestand een andere naam te geven, maar koppelt het bestand niet via een en dezelfde inode.

Het commando ln -s zal een symbolische koppeling maken naar een bestand. Gebruiken we bijvoorbeeld het commando

$ ln -s onzin larie

dan maken we de symbolische koppeling larie die wijst naar het bestand onzin. Als we het commando ls -i gebruiken, zien we dat de twee bestanden feitelijk verschillende inodes hebben.

$ ls -i onzin larie
22195 larie 22192 onzin
$

Gebruiken we echter het commando ls -l, dan zien we dat het bestand larie een symbolische koppeling is, wijzend naar onzin.

$ ls -l onzin larie
lrwxrwxrwx 1 root root 3 Aug 5 16:51 larie -> onzin
-rw-r--r-- 1 root root 12 Aug 5 16:50 onzin
$

De bevoegdheden bits voor een symbolische koppeling worden niet gebruikt (ze verschijnen dus altijd als rwxrwxrwx). In plaats daarvan worden de bevoegdheden bepaald door die van het doel van de symbolische koppeling. In ons voorbeeld dus door de bevoegdheden van onzin.

Functioneel zijn echte en symbolische koppelingen gelijk. Feitelijk zijn er een paar verschillen. Om te beginnen: je kunt een symbolische koppeling maken naar een bestand dat niet bestaat. Datzelfde kan nooit bij een echte koppeling. Bovendien worden symbolische koppelingen door de kernel anders behandeld dan echte koppelingen. Dat is natuurlijk alleen een technisch verschil, maar het is wel belangrijk! Symbolische koppelingen zijn makkelijk omdat ze aangeven naar welk bestand ze wijzen. Met echte koppelingen is het niet makkelijk uit te maken welke filenamen allemaal wijzen naar dezelfde inode.

Koppelingen worden op vele plekken in het Linux systeem gebruikt. Symbolische koppelingen zijn vooral belangrijk bij de gedeelde library images in /lib. Zie Verkenning van het bestandssysteem voor meer informatie over /lib.

Archivering en compressie van bestanden

Het tar commando wordt meestal gebruikt om bestanden te archiveren.

Het format van het commando is

tar {opties} file1 file2 ... fileN

waarbij {opties} slaat op de lijst commando's en opties voor tar, en file1 tot en met fileN slaat op de lijst van bestanden die in- of uitgepakt moet worden.

Het commando

$ tar cvf backup.tar next

bijvoorbeeld pakt alle bestanden in next in het tar archief backup.tar. Het eerste argument voor tar (``cvf'') is het tar ``commando''. ``c'' zegt tar om een nieuw archief bestand aan te maken. De ``v'' optie dwingt tar om te werken in de "verbose mode" (veel uitleg over wat tar doet), waarbij elke bestandsnaam wordt geschreven terwijl hij wordt gearchiveerd. De ``f'' optie maakt tar duidelijk dat het volgende argument (backup.tar) de naam is van het aan te maken archief. De rest van de argumenten voor tar zijn de bestands en directory namen die aan het archief moeten worden toegevoegd.

Het commando

$ tar xvf backup.tar

zal het tar bestand backup.tar uitpakken in de huidige directory. Dit kan soms gevaarlijk zijn. Als u bestanden uit een tar bestand uitpakt, kunnen oude bestanden overschreven worden.

Verder is het van belang voordat u tar bestanden uitpakt, om te weten waar de bestanden zullen komen staan. Bijvoorbeeld: laten we zeggen dat u de volgende bestanden heeft gearchiveerd: next/index.html, next/prog.c, en next/assign.dvi. Als u nu het commando gebruikt

$ tar cvf backup.tar next/index.html next/prog.c next/assign.dvi

wordt de directory naam next/ toegevoegd aan het begin van elke bestandsnaam. Om de betanden op de juiste plaats uitgepakt te krijgen dient u de volgende commando's in te voeren:

$ cd /
$ tar xvf backup.tar

omdat de bestanden worden uitgepakt met de padnaam in het archiefbestand opgeslagen.

Als u echter de bestanden hebt gearchiveerd met het commando

$ cd next
$ tar cvf index.html prog.c assign.dvi

is de directory naam niet bewaard in het archief. Daarom zou u ``cd next'' moeten invoeren voor u de bestanden uitpakt. Zoals u ziet maakt het groot verschil hoe u het archiefbestand hebt ingepakt. Het commando

$ tar tvf backup.tar

Kan worden gebruikt om een "index" te vertonen van het tar bestand voor u het uitpakt. Op die manier kunt u zien welke directory er mogelijk met de bestanden is meegekomen, zodat u de zaak op de goede manier kunt uitpakken.

Anders dan archiveringsprogramma's voor DOS comprimeert tar de bestanden niet automatisch bij het archiveren. Als u dus twee bestanden van 1 Mb elk archiveert, zal het tar bestand 2 Mb in omvang zijn. Het gzip commando kan worden gebruikt om een bestand te comprimeren. Het commando

$ gzip -9 backup.tar

zal backup.tar comprimeren en u het bestand backup.tar.gz opleveren: de gecomprimeerde versie van het bestand. De optie  -9 maakt aan gzip duidelijk dat de hoogste compressiefactor moet worden gebruikt.

Het gunzip commando kan worden gebruikt om een gzipped bestand uit te pakken. U kunt ook gebruik maken van ``gzip -d''.

gzip is een  relatief nieuw programma in de Linux/UNIX wereld. Gedurende vele jaren werd het compress commando gebruikt. Vanwege verschillende redenen wordt dit programma nu uitgefaseerd.

Gecomprimeerde bestanden hebben .Z als extensie. Zo is bijvoorbeeld backup.tar.Z de gecomprimeerde versie van backup.tar, terwijl backup.tar.gz de gezippede versie is. Het uncompress commando werd gebruikt om gecomprimeerde bestanden uit te pakken. gunzip weet daar ook mee om te gaan.

Derhalve: om een groep bestanden te archiveren en het resultaat te comprimeren kunt u de volgende commando's gebruiken:

$ tar cvf backup.tar next
$ gzip -9 backup.tar

Het resultaat zal het bestand  backup.tar.gz zijn. Om dit bestand uit te pakken gebruikt u de omgekeerde volgorde:

$ gunzip backup.tar.gz
$ tar xvf backup.tar

Natuurlijk moet u er wel zeker van zijn dat u in de juiste directory bent voor u een tar bestand uit pakt.

U kunt ook wat UNIX trucjes gebruiken om dit allemaal op een commando regel te doen, zoals hieronder:

$ tar cvf - next | gzip -9c > backup.tar.gz

Hier sturen we het tar bestand naar "-" wat staat voor tar's standaard uitvoer. Dit wordt gepiped naar gzip, die het binnenkomende tar bestand comprimeert en het resultaat wegzet in  backup.tar.gz. De -c optie voor gzip maakt gzip duidelijk om zijn uitvoer naar stdout te sturen, wat wordt omgeleid naar backup.tar.gz.

Een enkel commando om dit archief uit te pakken zou er zo uit zien:

$ gunzip -c backup.tar.gz | tar xvf -

Nogmaals: gunzip pakt de inhoud van backup.tar.gz uit en stuurt het resulterende tar bestand naar stdout. Dit wordt weer doorgevoerd naar tar, die ``-'' inleest, deze keer verwijzend naar tar's standaard invoer.

Gelukkig sluit het tar commando de z optie automatisch in, zodat bestanden onmiddellijk worden gecomprimeerd of uitgepakt, met gebruikmaking van het gzip compressie algoritme.

Bijvoorbeeld: het  commando

$ tar cvfz backup.tar.gz next

is equivalent aan

$ tar cvf backup.tar next
$ gzip backup.tar

Net als het commando

$ tar xvfz backup.tar.Z

gebruikt kan worden in plaats van

$ uncompress backup.tar.Z
$ tar xvf backup.tar

Lees de man pagina's van tar en gzip voor meer informatie.