Ik Van Linux

Bestanden


In dit hoofdstuk gaan we wat bestanden bekijken. We weten inmiddels dat bestandsnamen hoofdlettergevoelig zijn. En bestanden staan ergens in een directory. Maar hoe komen bestanden daar? Hoe krijgen we die daar weer weg? Of hoe kunnen we de inhoud wijzigen? En hoe wijzigen we de naam van een bestand?
Kortom weer ruim voldoende om er een pagina mee te vullen.

  • Plaats enkele of dubbele aanhalingstekens rond de bestandsnaam. Bijvoorbeeld 'dit bestand' of "een ander bestand".
  • Plaats een Escape teken voor elk speciale teken. Een beetje verwarrend misschien, maar een Escape teken heeft niets te maken met de ESC toets op het toetsenbord. In Bash is het Escape teken de achterwaarts schuine streep \ . Elk teken wat na dat Escape teken komt wordt letterlijk genomen, en wordt dus niet op de normale manier door Bash geïnterpreteerd. Bovenstaande voorbeelden zijn dus ook zo op te schrijven: een\ bestand en een\ ander\ bestand .
    Hier zie je weer een voorbeeld van een ongelukkig bijverschijnsel van vertalingen. De directory Video's moet in Bash dus omgeven worden door dubbele aanhalingstekens. Want enkele aanhalingstekens werken niet, omdat er al een in de naam voor komt. Of je moet het schrijven als Video\'s .

Het \ teken zelf kun je ook gebruiken door \\ te typen. De eerste \ is dus de Escape, terwijl de tweede \ het echte teken is wat letterlijk gebruikt wordt. Het is echter wel af te raden om tekens als \, * en ? te gebruiken in bestandsnamen. Het mag wel, maar het kan tot heel veel verwarring leiden als je die namen wilt gaan gebruiken.

Een punt als eerste teken van een bestandsnaam of directorynaam heeft een speciaal effect. Zo’n bestand of directory wordt dan verborgen (hidden) als je de inhoud van de directory bekijkt middels het ls commando. Je kunt de verborgen bestanden wel zien, als je de -a switch gebruikt. Dus ls -a toont alle bestanden en directories, ook als die verborgen zijn. Vergelijk de output maar eens tussen ls ~ en ls -a ~ .

Een punt ergens in de filenaam heeft geen speciale betekenis voor Linux. Dus bestand.txt had net zo goed konijn kunnen heten. In Windows is het gebruikelijk om bestandsextensies te gebruiken zodat het systeem weet met wat voor programma zo’n bestand moet worden geopend. Een bestandsextensie is daar vaak een punt gevolgd door een stuk of 3 letters. Dit is nog een erfenis van het DOS tijdperk. Enkele voorbeelden: plaatje.jpg, muziek.mp3, filmpje.avi, of document.doc.
In Linux kennen we dat zoals gezegd niet. Linux gebruikt een andere, meer betrouwbare, manier om te bepalen om wat voor type bestand het gaat. Dit neemt niet weg dat jij als mens het best wel handig kan vinden om een mp3 bestand met de extensie .mp3 te laten eindigen, of een plaatje met .jpg. En die vrijheid heb je gelukkig.

Bestanden lezen


Katten

Laten we eens de inhoud van een bestand bekijken.

cat /etc/hostname
raspberrypi

Dat was gemakkelijk. Met het commando cat kun je de inhoud van een bestand weergeven. Waarom cat? Dit commando is een afkorting van het Engelse woord conCATenate, wat aaneenschakelen betekent. Wat cat eigenlijk doet is alle tekstbestanden die je als parameters opgeeft aan elkaar plakken en naar het scherm sturen.

cat /etc/hostname /etc/hostname
raspberrypi
raspberrypi

Zie je wel, als je het bestand twee keer laat catten, plakt hij de inhoud gewoon achter elkaar.

Meer

Een ander voorbeeldje. Let even niet op de inhoud van het bestand in dit voorbeeld, je hoeft niet te snappen wat er in staat. Type eens cat /etc/mime.types . Zeer waarschijnlijk ging dat te snel en is een deel van de tekst alweer van het scherm verdwenen voordat je het hebt kunnen lezen. Ik gebruik het bestand /etc/mime.types hier alleen maar omdat ik een lang bestand nodig had wat op elke machine aanwezig is. En dit vond ik wel een geschikte kandidaat. Ik verwacht niet van je dat de inhoud van dat bestand snapt.
Type nu maar eens more /etc/mime.type . Je zult zien dat er een pauze wordt ingelast wanneer de pagina vol is. Door op de spatiebalk te drukken gaat de listing verder. Druk net zovaak op de spatiebalk totdat alles is afgedrukt.
Fijn, maar dat kan met een heel lang bestand wel heel lang duren. Daarom zal ik je nog een trucje leren om een programma vroegtijdig te kunnen stoppen. Type nog maar een keer het bovenstaande commando, maar druk niet op de spatiebalk om verder te gaan. Druk in plaats daarvan maar eens op Ctrl-C . Met Ctrl-C kun je meestal een programma vroegtijdig beëindigen. Overigens kun je more ook met de letter q stoppen (q van quit, ofwel ophouden).

Minder Is Meer

More is wel een beetje een dom commando. Er wordt steeds een pagina vol afgedrukt, waarna het programma wacht totdat de gebruiker op de spatiebalk drukt. Maar wat als je een keer te veel op de spatiebalk drukt? Je kunt niet meer terug. Slimme jongens hebben daar iets op bedacht en hebben het less commando gemaakt.
Dat komt van het Engelstalige grapje "less is more". Met andere woorden minder is meer. Dus is het te verwachten dat less meer kan dan more. En dat is ook zo.

Type maar eens less /etc/mime.type in. Weer wordt een pagina gevuld. Je kunt weer een hele pagina verder gaan met de spatiebalk, maar je kunt ook met de pijltjestoetsen regel voor regel door het bestand bladeren, zowel vooruit als achteruit. Ook de toetsen Home, End, Page Up en Page Down doen wat je van die toetsen mag verwachten.

Door op de / toets te drukken kun je een zoekterm onder in het scherm invoeren, waarna less naar de eerst volgende regel springt waarin die zoekterm voorkomt. Let wel, de zoekopdracht is hoofdlettergevoelig. Door op de n (n van next) te drukken ga je dan naar de volgende regel waarop de zoekterm voorkomt. De b toets gaat terug naar een vorige regel (b van back).

Achterwaarts zoeken kan ook, dan begin je de zoekterm met ? in plaats van /. En dat zijn nog maar een paar van de (meest gebruikte) mogelijkheden van het less commando.

Een Bestand Aanmaken

Een bestand aanmaken of wijzigen doe je met een tekstverwerker. Voor beginners raad ik nano aan. Dat is een vrij simpel te leren tekstverwerker. Ik heb een pagina gereserveerd, speciaal voor de uitleg van nano, dus daar ga ik nu even niet verder op in.

Maar nano is niet de enige tekstverwerker voor Linux. Vrijwel op elke Linux machine is de standaard tekstverwerker vi geïnstalleerd, of zelfs vim (VI IMproved, ofwel de verbeterde versie van vi). Mede omdat vi een hele krachtige tekstverwerker is kan de leercurve een beetje stijl zijn. Daarom vergeten we nu vi en vim maar even.
Een andere, veel gebruikte tekstverwerker is emacs . Ook een hele krachtige tekstverwerker met de daarbij behorende leercurve.

Een leeg bestand aanmaken doe je heel gemakkelijk met het touch commando. Doe maar eens touch olifant in je home directory. Het ls commando kan dan gebruikt worden om te bewijzen dat het bestand olifant bestaat. Met cat olifant kun je ook bewijzen dat het bestand leeg is. Het touch commando doet eigenlijk twee verschillende dingen. Het raakt een reeds bestaand bestand aan, waardoor de tijdstempel van dat bestand wordt geupdate. Maar als het bestand nog niet bestaat wordt het aangemaakt, zonder inhoud.

Bestanden Verplaatsen, Hernoemen, Verwijderen en Kopiëren

Nu we toch een testbestand hebben kunnen we daar meteen nog een paar experimenten mee gaan uitvoeren om nog wat extra commando’s te leren kennen.
Maak een nieuwe directory in je home map aan met de naam dierentuin. Wist je nog dat je dit met mkdir dierentuin doet? Oeps, nu heb ik het voorgezegd.
Verplaats nu de olifant naar de dierentuin met mv olifant dierentuin . mv staat voor MoVe, ofwel verplaats. De eerste parameter is wat je wil verplaatsen, de tweede is waar je het naar toe wil verplaatsen. Eigenlijk klopt dat niet helemaal, de laatste parameter is de bestemming. En alle parameters daarvoor zijn de bestanden die je wil verplaatsen. In ons geval is dat alleen de olifant, dus klopt het toch weer.

Ga nu in de dierentuin staan met cd dierentuin . Maak daar nu een paar extra bestanden aan. Bijvoorbeeld:

touch kangaroe nijlpaard gorilla gibbon giraffe gnoe pinguin

Met ls kun je zien dat je in een klap 7 nieuwe dieren hebt toegevoegd aan de dierentuin. Veel commando’s in Linux die iets met files doen kunnen op deze manier met meerdere bestanden tegelijk werken.

Merk op dat het woord kangaroe verkeerd gespeld is. Dat gaan we verbeteren, type mv kangaroe kangoeroe en de fout is hersteld.
Hier zie je dus een ander effect van het mv commando. Wanneer de bestemming een directory is dan zal het bronbestand (of de bronbestanden) verplaatst worden naar die directory. Maar wanneer de bestemming niet bestaat, of een bestand is, dan wordt de naam van de bron gewijzigd in de naam van de bestemming. Een reeds bestaand bestand met die naam wordt daarbij overschreven en gaat daarmee onherroepelijk verloren.
Bij het hernoemen van een bestand kun je maar met één bronbestand werken. Anders zou je alle bronbestanden dezelfde bestemming naam geven. Maar dat zijn kleinegeitjes, die ook in de dierentuin kunnen.

Nu verkopen we de giraffe . Die moet dus weg uit de dierentuin. Dat doe je met rm giraffe, daarbij is rm de afkorting voor ReMove, ofwel verwijder.

Laten we tenslotte een dier klonen. We maken een kopie van het nijlpaard en noemen het heel toepasselijk een schaap.

cp nijlpaard schaap

Het bestand schaap is nu een exacte kopie van het nijlpaard. We kunnen bij het kopiëren natuurlijk ook gebruik maken van een heel pad om de bron en/of de bestemming aan te geven. Zo kunnen we het schaap weer klonen naar een andere directory.

cp schaap /tmp/dolly

Nu staat er dus een gekloond schaap, dolly genaamd in de directory /tmp .

Je kunt ook directories kopiëren. Maar om dat te doen slagen moet je de -r switch aan het cp commando mee geven.

cd
cp dierentuin artis
cp: -r not specified; omitting directory 'dierentuin/'

Zie je, zonder de -r switch wordt het niets. De directory dierentuin is overgeslagen en is dus niet gekopieerd.

cp -r dierentuin artis

Dit werkt wel.

Je kunt ook meerdere bronbestanden opgeven. De laatste parameter van het cp commando is dan de bestemming. En die bestemming moet dan wel een directory zijn natuurlijk, want je kunt niet meerdere bestanden naar een en hetzelfde bestand kopiëren.

cd
mkdir kinderboerderij
cp dierentuin/* kinderboerderij

Mocht er in de bron directory dierentuin een of meerdere sub-directories aanwezig zijn dan moet je weer de -r switch opgeven om ook die sub-directories, met inhoud, mee te kopiëren.

De Dierentuin Gaat Sluiten

We zijn klaar met spelen in de dierentuin dus gaan we die opruimen. Dat doen we bij wijze van experimenten in meerdere stappen. Ik ga er even van uit dat je nog in de dierentuin staat (heel belangrijk).

ls
gibbon  gnoe  gorilla  kangoeroe  nijlpaard  olifant  pinguin
rm g*
ls
kangoeroe  nijlpaard  olifant  pinguin

Met rm g* hebben we alle bestanden weggegooid die met een g begonnen. De * wordt de wildcard, ofwel de joker genoemd. Bash vertaalt de * naar alle bestandsnamen uit de huidige directory die aan het zoekpatroon voldoen. In dit geval moet de bestandsnaam dus beginnen met een g, en verder mogen alle letters en leestekens nog voor komen, zo veel je wilt.
In ons geval worden rm g* dus door Bash vertaald naar rm gibbon gnoe gorilla, waarna het commando met die parameters wordt uitgevoerd. Het is daarom geen wonder dat de bestanden die met een g begonnen nu allemaal verwijderd zijn.

Daarna kunnen we de andere dieren ook verwijderen door rm * te doen. Bash vertaalt dat in ons geval weer door rm kangoeroe, nijlpaard olifant pinguin .
Maar laten we de bestanden nog even niet weggooien. Als je ze al wegegooid hebt kun je ze met touch weer even opnieuw aanmaken.

Doe nu het volgende, met nog tenminste één bestand in de directory:

cd ..
rmdir dierentuin
rmdir: failed to remove 'dierentuin/': Directory not empty

Hmm. Ik kan de dierentuin niet weggooien, want er staan nog bestanden in. Maar doe nu eens dit:

rm -r dierentuin

Nu lukt het wel. Deze verdient wel wat uitleg denk ik. We hebben al gezien dat rm bestanden kan wissen. Maar als je rm dierentuin zou doen, dus zonder de -r, dan zou je de foutmelding rm: cannot remove 'dierentuin': Is a directory te zien krijgen. Met andere woorden, rm kan geen directories wissen. Dat moet je met rmdir doen, zoals we inmiddels weten.
Maar rmdir kan alleen maar lege directories wissen. De dierentuin bevat nog wat dieren, dus gaat dat in ons geval niet lukken.
Maar met de -r switch is het wel mogelijk om directories te wissen met het rm commando. De -r switch betekent recursive, ofwel recursief. Dat wil zeggen dat eerst de hele inhoud van alle directories in de directory dierentuin wordt gewist, waarna alle directories in de directory dierentuin worden gewist, dan worden alle bestanden gewist, waarna tenslotte de inmiddels lege directory dierentuin wordt gewist.

Let wel, Linux kent GEEN prullenbak. Tenminste de terminal schil kent geen prullenbak. Een bestand wat je weggooit is …… weg. Definitief.
Er is geen undo commando. Wees daarom voorzichtig. Vooral wanneer je de switch -r switch en de * parameter gebruikt.