Hoofdstuk 3. Werken met bestanden

Inhoudsopgave

Werken met bestanden
Testbestanden aanmaken
Bestanden manipuleren
Werken met mappen
Werken met links
Meer over de inhoud van bestanden
Begin en eind
Tekst zoeken in een bestand
Andere bestandsformaten
Beveiliging van bestanden
Eigenschappen tonen
Hoe werkt beveiliging van bestanden?
Toegangsrechten veranderen
Samenvatting

Samenvatting

Na de kennismaking in hoofdstuk twee gaan we hier dieper in op het manipuleren van bestanden. We zullen onder andere leren hoe we:

  • Mappen aanmaken

  • Mappen verwijderen

  • Bestanden verhuizen

  • Bestanden copiëren

  • Bestanden verwijderen

  • Bestanden zoeken

  • Tekst in bestanden zoeken

  • Gedeelten van teksten tonen

  • Links aanmaken

  • Andere, niet-tekst bestanden tonen

  • Eigenschappen van bestanden tonen.

  • Permissies op bestanden tonen en veranderen

Werken met bestanden

Testbestanden aanmaken

Om enkele zinvolle tests te kunnen doen, moeten we eerst wat kladbestanden genereren. Uiteraard kan je dat doen door wat te surfen op het web en HTML pagina's te bewaren in je homedirectory of in /var/tmp. Of je zou OpenOffice.org kunnen starten, wat schrijven in een tekstbestand of een rekenblad en dat opslaan. Er zijn tal van toepassingen die toelaten om bestanden aan te maken. Het nadeel is meestal wel dat je daarvoor de toepassing in een grafische omgeving nodig hebt. Snel en makkelijk testbestanden creëren doe je met het commando touch in een terminal venster:

Handeling met de muis.

ubuntu@ubuntu:~$ touch bestand1 bestand2 bestand3
ubuntu@ubuntu:~$ ls
bestand1	bestand2	bestand3	Desktop
[Belangrijk]Grootte van de testbestanden

Dit commando maakt lege bestanden van 0 kilobyte aan. Heb je inmiddels al de man pagina van het ls commando gelezen? Dan weet je hoe je de grootte van een bestand kan zien!

[Opmerking]Over naamgeving en achtervoegsels

Voor het Linux systeem is het niet nodig om achtervoegsels zoals bijvoorbeeld .txt te gebruiken. Het systeem herkent ook zonder speciale achtervoegsels van welk type een bepaald bestand is. Je mag natuurlijk wel de achtervoegsels, zoals die op MS Windows gekend zijn, gebruiken zodat de organizatie van je bestanden voor jezelf duidelijker is. Ook grafische programma's voor bestandsbeheer maken soms gebruik van de achtervoegsels om ikonen aan bestanden toe te wijzen. In de tekstomgeving maakt het echter niet uit welke uitgang een bestand heeft.

Je mag je bestanden eender welke naam geven, er is geen beperking op het aantal karakters, behalve dan de lengte van een commandolijn, maar dat zijn vele honderden karakters. Behoed je echter voor het gerbuik van tekens die voor de shell een speciale betekenis hebben, zoals (, ), [, ], {, }, /, ?, *, ', ", ~, `, &, $, ! en |. Houd er ook rekening mee dat het Linux systeem hoofdlettergevoelig is.

Bestanden manipuleren

Kopiëren

Om een exacte kopie te maken van een bestand gebruiken we het cp commando, van copy. De syntax is eenvoudig genoeg:

cp bronmap/bronbestand doelmap/doelbestand

Praktisch:

Handeling met de muis.

ubuntu@ubuntu:~$ cp bestand1 bestand4
ubuntu@ubuntu:~$ cp bestand1 /var/tmp/testje
ubuntu@ubuntu:~$ cp /var/tmp/testje bestand5
ubuntu@ubuntu:~$ cp /var/tmp/testje /var/tmp/testje2
ubuntu@ubuntu:~$ cp bestand3 /var/tmp

Controleer steeds met ls het resultaat!

[Waarschuwing]Overschrijf geen bestanden!

Let goed op, want met Linux ben jij de baas. Als het doelbestand al bestaat, wordt het zonder waarschuwing overschreven. We zullen in Deel 3 bespreken wat we aan dit standaardgedrag kunnen veranderen.

Een aantal opmerkingen:

  • Als je geen mappen specifieert, hetzij met een absoluut, hetzij met een relatief pad, dan gaat het cp commando ervan uit dat je in de huidige map wilt werken. Dit geldt zowel voor het doelbestand als voor het bronbestand. Voorbeeld: cp bestand1 bestand2.

  • Als je enkel een doelmap specifieert en geen doelnaam, blijft de naam van het bronbestand behouden. Voorbeeld: cp bestand1 map1/.

  • Je kan meerdere bestanden tegelijk kopiëren, maar dan moet het laatste argument (= de laatste bestandsnaam) een naam van een map zijn. Voorbeeld: cp bestand1 bestand2 bestand3 map1.

  • Om meerdere bestanden tegelijk naar een map te kopiëren mag je de zogenaamde wildcards ? en * gebruiken. Een vraagteken staat gelijk met 1 karakter, een sterretje staat gelijk met eender welk aantal karakters. Bijvoorbeeld:

    Handeling met de muis.

    ubuntu@ubuntu:~$ cp bestand? /var/tmp
    ubuntu@ubuntu:~$ ls /var/tmp
    bestand1	bestand2	bestand3	bestand4	testje
    ubuntu@ubuntu:~$ cp be* Desktop
    

    Alle bestanden waarvan de naam begint met be worden naar de map Desktop gecopieerd.

[Belangrijk]Kan je nog volgen?

Probeer al deze voorbeelden ook zelf uit. Dat zal je helpen om Linux in de vingers te krijgen.

Noteer ook het veelvuldig gebruik van ls. Het commando komt overal van pas.

Verplaatsen

Voor het verplaatsen en/of hernoemen van bestanden en mappen gebruiken we het commando mv, wat staat voor move. De syntax is gelijkaardig aan die van het cp commando:

mv bronmap/bronbestand doelmap/doelbestand

Een aantal voorbeelden:

Handeling met de muis.

ubuntu@ubuntu:~$ mv /var/tmp/testje bestand5
ubuntu@ubuntu:~$ mv Desktop/be* .
ubuntu@ubuntu:~$ mv bestand1 /var/tmp
[Belangrijk]Weet je nog?

De punt staat voor de huidige map. We zagen al eerder dat het ls commando daarover informatie kan geven. Je kan . en .. ook zelf gebruiken op de opdrachtregel. Noteer dat je ls zowel voor gewone bestanden als voor mappen gebruikt om verschillende eigenschappen ervan op te vragen, zie ook de paragraaf “Werken met mappen”.

Kan je vanuit de map, waarin je je bevindt wanneer je net een terminal venster geopend hebt, een testbestand naar .. verhuizen? Wat gebeurt er? Wat is het absolute pad voor de map waarin je huidge werkmap zich bevindt? Heb je een vermoeden wat er hier gaande is?

[Opmerking]Verschillende inhoud?

Als je aan het experimenteren gaat, kan het wel eens gebeuren dat je niet exact hetzelfde op je scherm ziet als in de cursus. Beschouw bovenstaande als voorbeelden van hoe je commando's gebruikt. Schrik niet mocht je foutmeldingen krijgen. Probeer te begrijpen wat er gebeurt, zowel door de boodschappen van de shell te analyzeren als door verschillende commando's uit te proberen. Oefening is de beste leermeester!

Verwijderen

Bestanden of mappen verwijderen doe je met het rm commando, van remove. Geef één of meerdere mapnamen of bestandsnamen als argument:

ubuntu@ubuntu:~$ rm /var/tmp/bestand1
ubuntu@ubuntu:~$ rm best*

Dit commando heeft ook effect op mappen, mits gebruik van een speciale optie. Meer hierover in de paragraaf “Mappen aanmaken” en de paragraaf “Mappen verwijderen”.

Zoeken

Eenvoudig zoeken op bestandsnaam

Recht-toe recht-aan bestanden of mappen zoeken kan je met behulp van het commando locate (lokaliseer). Bijvoorbeeld:

Handeling met de muis.

ubuntu@ubuntu:~$ locate Desktop

Deze opdracht geeft alle absolute paden weer waarin het woord Desktop voorkomt. Let wel:

  • Dit programma baseert zich op de inhoud van een database die normaliter 's nachts wordt aangemaakt. De Live CD bevat een oude database, vandaar de foutboodschap die je ziet telkens je dit commando gebruikt.

  • Indien je computer niet opstaat 's nachts, zal de database opgebouwd worden na het opstarten. In elk geval zullen namen van bestanden en mappen die aangemaakt werden na de laatste indexatie niet weergegeven worden. Probeer bij wijze van test een locate met als argument een nieuw aangemaakt testbestand bestand6.

  • Zoals alle commando's is ook dit commando hoofdlettergevoelig. Probeer bijvoorbeeld maar eens locate desktop in plaats van locate Desktop.

Gedetailleerd zoeken van bestanden

Om bestanden te vinden die recenter aangemaakt zijn, of om bestanden met bepaalde eigenschappen te zoeken, hebben we het find commando, van vinden. Dit commando bestaat al ongeveer even lang als UNIX zelf, wat zich uit in de ietwat archaïsche syntax:

find zoekmap zoekoptie[s] [zoekakties]

Bij dit commando moet je dus eigenlijk weten wat je zoekt en waar je het gelaten hebt, want je moet zowel kunnen specifiëren welk object je zoekt als waar je de zoekaktie wilt beginnen. Optioneel kan je verdere bepalingen geven van wat er met de gevonden bestanden moet gebeuren. Een eenvoudig voorbeeld:

Handeling met de muis.

ubuntu@ubuntu:~$ touch bestand6
ubuntu@ubuntu:~$ find ~ -name bestand6
/home/ubuntu/bestand6

De tilde (~) beduidt je homedirectory. Je ziet hier dat het volle pad daarnaartoe /home/ubuntu is. Indien je je daar bevindt, kan je ook . gebruiken als startpunt van de zoekopdracht. Vanaf het startpunt worden alle lager gelegen mappen in de hiërarchie van het bestandssysteem doorzocht. Elke bestandsnaam die de opgegeven zoeknaam bevat, in dit geval bestand6 wordt met het volle pad ernaartoe op het scherm gezet.

Met find kan je veel meer dan enkel op naam zoeken: je kan bestanden zoeken die groter of kleiner dan een bepaalde grootte zijn, ouder of nieuwer dan een bepaald tijdstip, veranderd voor of na een bepaalde datum, bestanden die van bepaalde gebruikers of groepen zijn, van een bepaald type of met bepaalde toegangspermissies. Op de gevonden bestanden kunnen meteen ook zoekakties uitgeoefend worden. De zoekaktie is standaard -ls, een lijst tonen van de gevonden bestanden. Je zou de gevonden bestanden bijvoorbeeld ook gelijk kunnen verwijderen door een andere zoekaktie op te geven.

[Belangrijk]Lijstopties

Lees in de man pagina van find welke opties er aan het ls commando worden toegevoegd bij de standaard output.

Commando's zoeken met which

Als je wilt weten waar een bepaald commando zich bevindt, gebruik dan which met de naam van het commando als argument. Voorbeelden:

ubuntu@ubuntu:~$ which ls
/bin/ls

Het which commando zoekt in alle mappen die gedefinieerd zijn in de PATH variabele. Deze variabele bevat een lijst van mappen waarin zich programma's bevinden. De shell leest de lijst in en vindt zo commando's die je intikt.

[Opmerking]Variabelen?

Variabelen bepalen hoe de shell werkt. Meer over variabelen in Hoofdstuk 12, Netwerken van het derde lespakket.

De inhoud van een variabele bekijk je als volgt:

echo $VARIABELE

In dit geval geeft dat:

Handeling met de muis.

ubuntu@ubuntu:~$ echo $PATH
/usr/local/bin:/usr/local/sbin:/sbin:/usr/sbin:/bin:/usr/bin:/usr/bin/X11:/us
r/games

Het which commando vertelt je dus in welk van deze mappen een gegeven commando zich bevindt.

De mappen worden gescheiden door een dubbele punt. De eerste map waarin een commando gevonden wordt, wordt als resultaat op het scherm gezet. Als geen enkele map het gezochte commando bevat, is er geen output. Dat wil echter niet zeggen dat het commando niet op je systeem te vinden is. Misschien zit het in een map die niet doorzocht wordt. Hoe je dit probleem oplost, bekijken we in Deel 3.

Commando's zoeken met behulp van de shell

Vergeet ook niet dat je commando's kan zoeken, of beter, vervolledigen, door enkele beginletters te tikken in een terminal en dan de Tab-toets te gebruiken. Als er slechts één enkele mogelijkheid is, zal de shell het commando vervolledigen. Als er meerdere mogelijkheden zijn, krijg je een (visuele) bel. Druk twee keer op de Tab om een lijst van de opties te krijgen.

Handeling met de muis.

Gebruik de Bash feature Ctrl+R om te zoeken in de commandogeschiedenis:

ubuntu@ubuntu:~$ [typ nu ctrl+R]
(reverse-i-search)`': 

Typ nu een sequentie van karakters die voorkomt in het commando dat je wilt herhalen, bijvoorbeeld “fi” van find. Met commando bedoelen we hier wel de gehele commandoregel, inclusief argumenten, opties en bestandsnamen. Dus je kan ook een sequentie van een lange bestandsnaam opgeven, om die niet opnieuw te hoeven tikken. De shell zal proberen om aan te vullen. Wordt er niets gevonden, typ dan Ctrl+C. Wordt er wel iets gevonden maar is het nog niet hetgeen je zocht, typ dan wat meer karakters of gebruik de pijltjes om omhoog en omlaag te rollen door de commandogeschiedenis.

[Opmerking]Control sequenties

Het gebruik van de Ctrl-toets gevolgd door een letter wordt ook wel eens weergegeven met een accent circumflex, bijvoorbeeld “^R” voor Ctrl+R en “^C” voor Ctrl+C.

Werken met mappen

Mappen aanmaken

Een nieuwe map maak je met het mkdir commando (make directory). Geef één of meerdere mapnamen als argument:

Handeling met de muis.

ubuntu@ubuntu:~$ mkdir map1 map2 map3

Controleer met het ls commando wat het resultaat is. Je ziet onmiddellijk het verschil: mappen worden in blauw aangeduid. De argumenten kunnen eens te meer absolute of relatieve paden naar mappen zijn. Als je geen pad meegeeft, gaat het programma ervan uit dat je een map in de huidige map wilt aanmaken.

Mappen verwijderen

Een lege map verwijderen doe je met het rmdir (remove directory) commando.

[Belangrijk]En mappen die niet leeg zijn?

Maak een map aan en plaats daarin een bestand. Wat gebeurt er als je deze map wilt verwijderen?

Mappen die nog bestanden bevatten verwijder je door eerst de bestanden te verwijderen uit de map. Daarna kan je rmdir gebruiken met de naam van de lege map als argument.

[Tip]Dat is toch veel werk?

Inderdaad, als je op die manier een aantal volle mappen leeg moet maken, is de lol er snel af. Eén van je taken bij dit cursusdeel bestaat erin een snellere manier te vinden om van volle mappen af te raken. De taken worden beschreven aan het einde van dit hoofdstuk, daar vind je ook hints die je zullen helpen de oplossing te vinden.

Werken met links

Wat zijn links?

In sommige gevallen zal je merken dat de volledige info van een bestand begint met de letter “l”, van link. Het systeem met links wordt veel gebruikt op UNIX- en Linuxsystemen om plaats te besparen. Een link is eigenlijk niets meer dan een manier om twee of meer bestandsnamen te koppelen aan dezelfde bestandsdata.

Om links te begrijpen, moeten we iets meer weten over hoe een bestand in het bestandssysteem opgeslagen wordt. Per map zijn er een zeker aantal inodes beschikbaar, dat zijn wegwijzers naar de datablokken die de inhoud van een bestand vormen. In de interne struktuur van de map bevindt zich een lijst waarin bestandsnaam, overeenkomstige inode en overeenkomstige datablokken met elkaar gerelateerd worden. Het systeem maakt intern geen onderscheid tussen gewone bestanden, mappen of andere bestandstypes. Alle soorten data worden eenvoudigweg beschouwd als bestanden met een inodenummer dat verwijst naar de datablokken voor dat bestand.

Er zijn twee manieren om bestanden te linken:

  • Een harde link: associeert twee of meer bestandsnamen met dezelfde inode. Harde links delen dezelfde datablokken op de harde schijf en gedragen zich onderling onafhankelijk van elkaar. Elk gewoon bestand is in principe een hardlink naar zichzelf, vandaar dat bestanden die je net aangemaakt hebt het getal “1” hebben in de tweede kolom van de volledige bestandsinformatie die je kan opvragen met ls -l bestand.

  • Een symbolische link of symlink: een klein databestand is een pointer (wegwijzer) naar een andere bestandsnaam. Een symbolische link is niet onafhankelijk van het doelbestand: als het doelbestand verdwijnt, werkt de link niet meer.

Het voordeel van een symbolische link is dat dit type link partities kan overspannen. Een harde link moet binnen eenzelfde partitie blijven. Toch worden harde links op sommige systemen gebruikt om redenen van robuustheid: als je de link verwijdert, of het bestand zelf, blijven toch de bestandsdata (de inhoud) bestaan, toegankelijk via de bestandsnaam of via de linknaam. Een harde link kan dus eigenlijk nooit stuk gemaakt worden: de inhoud van het bestand wordt nooit verwijderd door de linknaam of de bestandsnaam te verwijderen. Als gewone gebruiker zal je echter meestal met symbolische links werken, omdat ze beter zichtbaar zijn.

[Opmerking]Partitie?

Een partitie is het Linux-equivalent van een drive op MS Windows.

Onderstaande tekening verduidelijkt het een en ander:

Figuur 3.1. Harde en symbolische links

Harde en symbolische links

  • hlink is een harde link naar bestand: ze delen dezelfde inode N1.

  • slink is een symbolische link naar bestand, met een aparte inode N2, die via de linkdatablokken naar het oorspronkelijke bestand verwijst.

Let op: bestand, hlink en slink zijn slechts namen van bestanden. De naam van een bestand staat min of meer los van de inhoud ervan.

Gezien beide soorten links ultiem naar de datablokken van het doelbestand verwijzen, gedragen links zich op dezelfde manier als het doelbestand zelf.

Men zou kunnen argumenteren dat er nog een derde soort van link is, de zogenaamde user-space link, die vergelijkbaar is met de shortcuts of snelkoppelingen in MS Windows. Dit zijn bestanden die meta-data bevatten die enkel geïnterpreteerd kan worden door de grafische bestandenbeheerder. Voor ons Linux systeem en voor de shell zijn dit echter bestanden als alle andere. Dit soort links eindigt bijvoorbeeld met de suffix .desktop of .lnk en aanmaken is eenvoudig genoeg met behulp van de features van je grafische omgeving. Gezien deze bestanden van geen betekenis zijn voor het werk dat we in deze cursus verrichten op de commandoregel, gaan we hier niet verder op in.

Links aanmaken

Het meest gebruikt op Linux systemen zijn symbolische links, omdat ze eenvoudig te onderscheiden zijn van gewone bestanden en verder voordelen hebben die te maken hebben met de indeling van je harde schijf of schijven.

Links worden heel veel gebruikt in de /usr/lib map, die bibliotheken voor de meeste programma's bevatten. Elke bibliotheek heeft een versienummer, dat natuurlijk verandert bij elke update van het programma waarvoor ze dient. Om niet telkens de hele code te moeten aanpassen wanneer er een nieuwe bibliotheek beschikbaar is, gebruiken we enkel de naam van de bibliotheek, eventueel gevolgd door het hoofdnummer van de versie, maar verder zonder detail.

[Opmerking]Bibliotheek?

Bibliotheken zijn hulpbestanden waarin alle funtionaliteiten van een programma gedefinieerd worden.

Bijvoorbeeld:

Handeling met de muis.

ubuntu@ubuntu:/usr/lib$ ls -l libaudiofile*
lrwxrwxrwx  1 root root         21  2005-04--14 15:15 libaudiofile.so.0 -> libaudiofil
e.so.0.0.2
-rw-r--r--  1 root root 132012 2005-04-14 15:15 libaudiofile.so.0.0.2

Merk op dat de link zelf slechts een klein bestandje is: 21 bytes. Het eerste karakter op de lijn van de link is een “l”, we herkennen de link door de verwijzing “->”, gevolgd door de naam van het bestand waar de link naar wijst.

Zelf een symbolische link aanmaken doe je als volgt:

ln -s doelbestand linknaam

Bijvoorbeeld:

Handeling met de muis.

ubuntu@ubuntu:~$ ln -s bestand1 link_naar_1
ubuntu@ubuntu:~$ ls -l
total 2
-rw-r--r-- 1 ubuntu ubuntu      0 2006-05-31 12:56 bestand1
lrwxrwxrwx 1 ubuntu ubuntu      8 2006-05-31 14:41 link_naar_1 -> bestand1

Noteer dat in bovenstaande schermoutput enkel de relevante bestandsnamen weergegeven worden, uiteraard staan er ondertussen al wel meer bestanden in je map.

[Opmerking]En alweer ls

Ook voor het controleren van links gebruiken we het ls commando.

[Tip]Inodes zoeken

Mocht je het ooit nodig hebben, zoek dan inodenummers met behulp van het find commando.