Tips en Trucs 2019

Bestanden en mappen kopiëren

Beginnende Linux gebruikers doen bijna alles via de grafische omgeving. Je kunt echter bijna alle taken ook in een zeer krachtige terminal omgeving uitvoeren. Daarbij horen ook basisopdrachten zoals het kopiëren van bestanden en mappen.

Om bestanden en mappen met terminalopdrachten te kopiëren, gebruiken we de cp opdracht.

De cp opdracht

De cp opdracht heeft altijd de volgende algemene vorm:

cp [OPTIES]... BRON DOEL

Deze opdracht kopieert de bron naar het doel.

Eenvoudigste kopieeropdracht

Daarbij geef je enkel een bron en doel op. De volgende opdracht kopieert het verborgen bestand .bash_history naar het bestand Opdrachten_geschiedenis:

dany@pindabook:~> cp .bash_history Opdrachten_geschiedenis

Bestanden en mappen die beginnen met een punt zijn verborgen bestanden en bevatten meestal gegevens die je niet hoeft aan te passen, maar die programma's gebruiken om bijvoorbeeld instellingen bij te houden. Let ook op het voorkomen van _ (underscore) tekens die dikwijls gebruikt worden in plaats van spaties. Spaties worden in terminal opdrachten gebruikt als scheidingstekens tussen opdrachten, opties, enz. De volgende opdracht kopieert het Opdrachten_geschiedenis bestand naar de Bureaublad-map:

dany@pindabook:~> cp Opdrachten_geschiedenis ~/Bureaublad/

Het ~ teken vervangt daarbij het volledige pad naar uw Persoonlijke map.

Waarschuwing bij overschrijven

Indien het doelbestand reeds bestaat, wordt het doelbestand stilzwijgend overschreven. Wil je echter zelf beslissen of het doelbestand wordt overschreven, zorg dan dat cp interactief werkt (-i optie):

dany@pindabook:~> cp -i Opdrachten_geschiedenis ~/Bureaublad/
cp: '/home/dany/Bureaublad/Opdrachten_geschiedenis' overschrijven? j

In het voorbeeld gaf ik met j (van ja) aan dat het bestand mocht overschreven worden. Internationaal gebruikt men echter als bevestigend antwoord y van yes.

Doelbestanden niet overschrijven

Om bestaande doelbestanden zonder te vragen nooit te overschrijven, gebruik je de -n optie:

dany@pindabook:~> ls -l Bureaublad/
totaal 16
-rw------- 1 dany users 15476 23 mrt 15:54 Opdrachten_geschiedenis
dany@pindabook:~> cp -n Opdrachten_geschiedenis ~/Bureaublad/
dany@pindabook:~> ls -l Bureaublad/
totaal 16
-rw------- 1 dany users 15476 23 mrt 15:54 Opdrachten_geschiedenis

De ls opdrachten tonen dat het doelbestand niet werd overschreven (zelfde datum en tijd).

Enkel minder recente bestanden overschrijven

Om enkel nieuwe en recentere bestanden te kopiëren, gebruik je de -u optie (m.a.w. updaten):

dany@pindabook:~> cp -u .bash_history ~/Bureaublad/Opdrachten_geschiedenis

Mappen kopiëren

De cp opdracht werkt enkel met bestanden. Om mappen te kunnen kopiëren moet de inhoud ervan gekopieerd worden. Dit kan met de -r optie (recursief). Let op bij het volgende voorbeeld, indien uw Downloads map veel bevat, kan de volgende opdracht veel tijd in beslag nemen:

dany@pindabook:~> cp -r ~/Downloads/ ~/Bureaublad/

Snelkoppelingen

Om schijfruimte te besparen en wijzigingen op de bronbestanden uit te voeren, gebruikt men snelkoppelingen (symbolic links). Met de volgende opdrachten vervang je de Opdrachten_geschiedenis door een snelkoppeling naar het originele bestand:

dany@pindabook:~> rm Opdrachten_geschiedenis
dany@pindabook:~> cp -s .bash_history Opdrachten_geschiedenis
dany@pindabook:~> ls -l Opdrachten_geschiedenis
lrwxrwxrwx 1 dany users 13 23 mrt 16:24 Opdrachten_geschiedenis -> .bash_history

Met de eerste opdracht verwijderen we het bestaande bestand, daarna wordt de snelkoppeling aangemaakt met de cp opdracht. En de ls opdracht toont ons dat de snelkoppeling doorverwijst naar het originele bestand.

Snelkoppelingen kopiëren

Om niet het bestand waarnaar de snelkoppeling wijst, maar de snelkoppeling zelf (verwijzing) te kopiëren, gebruik je de -P optie:

dany@pindabook:~> cp -P Opdrachten_geschiedenis ~/Bureaublad/
dany@pindabook:~> ls -l ~/Bureaublad/Opdrachten_geschiedenis
lrwxrwxrwx 1 dany users 13 23 mrt 16:42 /home/dany/Bureaublad/Opdrachten_geschiedenis -> .bash_history

Je merkt snel aan de rode achtergrond, dat er hier iets niet klopt. Doordat je de eigenlijke snelkoppeling naar een andere map kopieerde, wijst de gekopieerde snelkoppeling naar een bestand dat niet in dezelfde map staat. Toch zijn zulke opdrachten handig voor het maken van reservekopieën (back-ups) in speciaal daarvoor aangemaakte mappen. M.a.w. exacte kopieën.

Bestandseigenschappen kopiëren

Soms wil je enkel de eigenschappen (rechten, gebruiker, groep en datum en tijd)van een bestand kopiëren naar een ander bestand:

dany@pindabook:~> touch oud.txt
dany@pindabook:~> sleep 60
dany@pindabook:~> touch nieuw.txt
dany@pindabook:~> ls -l oud.txt
-rw-r--r-- 1 dany users 0 23 mrt 18:42 oud.txt
dany@pindabook:~> chmod g+w oud.txt 
dany@pindabook:~> ls -l oud.txt
-rw-rw-r-- 1 dany users 0 23 mrt 18:42 oud.txt
dany@pindabook:~> ls -l nieuw.txt
-rw-r--r-- 1 dany users 0 23 mrt 18:43 nieuw.txt
dany@pindabook:~> cp --attributes-only --preserve nieuw.txt oud.txt 
dany@pindabook:~> ls -l oud.txt
-rw-r--r-- 1 dany users 0 23 mrt 18:43 oud.txt

De touch opdrachten maken telkens een nieuwe leeg bestand aan. De sleep opdracht zorgt ervoor dat tussen de creatie van de twee bestanden minstens 60 seconden verlopen is. Met de ls -l opdrachten worden telkens de eigenschappen van een bestand weergegeven. Met de chmod opdracht geven we het bestand voor de groep (g) waartoe de gebruiker behoort schrijfrechten (+w). De cp opdracht met de opties --attributes-only --preserve geeft de eigenschappen van het bestand nieuw.txt door aan het bestand oud.txt.

cp