Saltar la navegación

cp

La orden cp hace copias de uno o más ficheros o directorios. Al contrario que ln y mv, cp no solo se limita a hacer una reorganización de las entradas de algunos directorios, sino que también copia los bloques de datos de los ficheros.

Las formas de uso de cp son:

cp [opción...]  fich_fuente  fich_destino
cp [opción...]  fich_fuente...  dir_destino
cp [opción...]  -r  {fich_fuente | dir_fuente}...  dir_destino

En el primer caso se hace una copia de fich_fuente con el nombre fich_destino, es decir, tendremos dos ficheros distintos con el mismo contenido.

$ ls
f.txt
$ cp f.txt g.txt
$ ls
f.txt  g.txt

Con el segundo formato, uno o varios ficheros se copian en un directorio diferente manteniendo el nombre.

$ tree
.
├── d
├── f.txt
└── g.txt

1 directory, 2 files
$ cp f.txt g.txt d
$ tree
.
├── d
│   ├── f.txt
│   └── g.txt
├── f.txt
└── g.txt

1 directory, 4 files

Una copia puede ser recursiva o no. Para que sea recursiva se deberá especificar la opción -r. Esto solo afecta a la copia de los directorios y no a la copia de los ficheros ordinarios que vayan en la misma linea de comando. Veamos las diferencias entre ambas:

  • Copia no recursiva: En este caso el directorio de destino debe existir antes de dar la orden de copia, y todos los argumentos fuentes deben ser ficheros ordinarios. Cada fichero fuente se copia en el directorio de destino con el mismo nombre. Con la primera de las sintaxis el nombre de la copia puede ser cambiado. La primera y la segunda forma de uso no son recursivas.
  • Copia recursiva: El comportamiento de la copia recursiva depende de si el directorio de destino existe antes de dar la orden de copia o no:
    • Si dir_destino no existe, solo se puede especificar un dir_fuente. En primer lugar se creará dir_destino, y a continuación se copiarán todos los ficheros y subdirectorios del directorio fuente en él.
$ tree
.
└── d1
    ├── d11
    │   └── h.txt
    ├── f.txt
    └── g.txt

2 directories, 3 files
$ cp -r d1 d2
$ tree
.
├── d1
│   ├── d11
│   │   └── h.txt
│   ├── f.txt
│   └── g.txt
└── d2
    ├── d11
    │   └── h.txt
    ├── f.txt
    └── g.txt

4 directories, 6 files
    • Si dir_destino existe previamente, se copiará cada fichero fuente al directorio de destino, tal como se hace en una copia no recursiva, pero cada directorio fuente es reproducido como un subdirectorio en el directorio de destino, incluyendo sus ficheros y sus subdirectorios.
$ tree
.
├── d1
│   ├── d11
│   │   └── h.txt
│   ├── f.txt
│   └── g.txt
├── d2
├── p.txt
└── t.txt

3 directories, 5 files
$ cp -r p.txt d1 t.txt d2
$ tree
.
├── d1
│   ├── d11
│   │   └── h.txt
│   ├── f.txt
│   └── g.txt
├── d2
│   ├── d1
│   │   ├── d11
│   │   │   └── h.txt
│   │   ├── f.txt
│   │   └── g.txt
│   ├── p.txt
│   └── t.txt
├── p.txt
└── t.txt

5 directories, 10 files

Con cp, al igual que con mv y ln, hay que tener cuidado con reemplazar ficheros que ya existan.

Opciones de la orden cp son:

-d Hace copia de un enlace simbólico creando un nuevo enlace simbólico. Por defecto la copia de un enlace simbólico crea una copia del fichero original.
-u Hace la copia del fichero si origen es más reciente que destino o no existe destino.
-n No sobrescribe si destino ya existe.
-l Todas las copias las hace como enlaces duros.
-i Si destino existe entonces cp pregunta al usuario si desea reescribirlo.
-f Si destino existe entonces cp lo sobrescribe y no da error (opción por defecto).  
-b Si destino existe entonces cp le hace una copia de seguridad.
-S extensión Extensión que se añadirá a las copias de seguridad. Por defecto se usa la ~.
-v Muestra por la salida estándar los ficheros o directorios que va copiando.
-s Todas las copias las hace como enlaces simbólicos-

El siguiente gráfico puede clarificar la diferencia entre copiar ficheros y los dos tipos de enlaces (duro y simbólico):

Comparativa cp y ln

Por defecto, el comando cp copia los enlaces, tanto duros como simbólicos, como ficheros distintos con el mismo contenido que el original.

$ ls -li
total 4
27933891 -rw-r--r-- 1 usuario usuario 6 may 14 20:50 f.txt
27933794 lrwxrwxrwx 1 usuario usuario 5 may 14 20:52 l.txt -> f.txt
$ cp l.txt g.txt
$ ls -li
total 8
27933891 -rw-r--r-- 1 usuario usuario 6 may 14 20:50 f.txt
27928294 -rw-r--r-- 1 usuario usuario 6 may 14 21:01 g.txt
27933794 lrwxrwxrwx 1 usuario usuario 5 may 14 20:52 l.txt -> f.txt

Para cambiar este comportamiento están las opciones -d, -l y otras que pueden consultarse en el manual del sistema (man cp).

Licencia: licencia de software libre GPL