# Ubuntu: Linux voor mensen/Werken met bestanden/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:
Praktisch:
* 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
* 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:
* ubuntu@ubuntu:~$ cp bestand? /var/tmp
* ubuntu@ubuntu:~$ ls /var/tmp
* bestand1 bestand2 bestand3 bestand4 testje
* ubuntu@ubuntu:~$ cp be* Desktop
Kan je nog volgen? Probeer al deze voorbeelden ook zelf uit. Dat zal je helpen om Linux in de vingers te krijgen. Gebruik 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:
Een aantal voorbeelden:
* ubuntu@ubuntu:~$ mv /var/tmp/testje bestand5
* ubuntu@ubuntu:~$ mv Desktop/be* .
* ubuntu@ubuntu:~$ mv bestand1 /var/tmp
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?
* 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!
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:
* 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:
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:
* 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.

### 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.
* 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:
In dit geval geeft dat:
* ubuntu@ubuntu:~$ echo $PATH
* /usr/local/bin:/usr/local/sbin:/sbin:/usr/sbin:/bin:/usr/bin:/usr/bin/X11:/usr/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.
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.
* 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.