Cp: verschil tussen versies

Uit De Vliegende Brigade
Naar navigatie springen Naar zoeken springen
Regel 8: Regel 8:
  
 
  cp -r /media/sda1 /media/BackUp
 
  cp -r /media/sda1 /media/BackUp
 +
 +
Nu wordt er een map <code>/media/Backup/sda1</code> aangemaakt en gevuld.
  
 
== Kopiëer de inhoud van een map ==
 
== Kopiëer de inhoud van een map ==

Versie van 21 jul 2019 11:13

Kopiëer een bestand

cp a b

Kopiëer een map met inhoud

Bv.:

cp -r /media/sda1 /media/BackUp

Nu wordt er een map /media/Backup/sda1 aangemaakt en gevuld.

Kopiëer de inhoud van een map

Voorbeelden:

cp -r * ~/in1
cp -r ~/in1/* .
# Kopiëer de inhoud van map "test.example.com" naar map "example.com"
# Let op: Map "example.com" moet al bestaan
#
cp -r test.example.com/* example.com   # De doelmap 'example.com' moet al bestaan

cp -vrap

Hier kwam ik de attributen -rap tegen. Wat is dat?

  • -v - Verbose - Dit was een operatie die een paar minuten duurde. Vandaar
  • -r - Recursie
  • -a - Archive - Misschien dat een archief-bit wordt behouden?
  • -p - Preserve - Behoud mode, ownership en timestamps.

Kopiëren van dot-bestanden

Zie Dot-bestanden kopiëren en verplaatsen

Kopiëren zonder overschrijving

-n [1]

Argument list too long-error (juni 2019)

Het probleem

In een map met veel bestanden:

cp Koolborstels* tmp

bash: /bin/cp: Argument list too long

Oorzaak

Het commando cp Koolborstels* tmp wordt eerst geëxpandeerd om alle bestanden in de map te incorporeren. Binnen operating systems is er een maximum hoeveelheid geheugenruimte die daarvoor beschikbaar is. Die kun je zien mbv. GETCONF. Voorbeeld:

getconf ARG_MAX

2097152

En dit is 2097152/1024 = 2.048 KB = 2 MB.

Workaround met een loop

Er zijn diverse oplossingen. Eentje is door kopiëren in een loop te doen, waarbij er per keer maar één bestand wordt gekopiëerd.

Om te beginnen (ls is gemakkelijker voor testen):

for i in ./*; do ls "$i"; done

Dit toont alle bestanden in de map.

Dit sluit beter aan bij de situatie hierboven:

for i in ./Koolborstel*; do ls "$i"; done

En dit is de uiteindelijke oplossing:

for i in ./Koolborstel*; do cp "$i" /tmp -v; done

Met -v zodat je weet waar-ie in Godsnaam mee bezig is.

Bronnen