Saltar al contenido

Comando CP – Linux

09/27/2019

Copiar es una tarea indispensable en cualquier sistema operativo y en Linux puedes encontrar el comando cp que te permite copiar archivos y directorios pero no solo eso, cp es un comando linux rico en funcionalidades además te permite copiar enlaces (duros y simbólicos), permisos, propiedades, etc.

Te explico este comando con más de 19 ejemplos prácticos.

Comandos Linux: cp

El comando linux cp es uno de los comandos básicos que cualquier persona interesada en aprender Linux debe saber. Este comando sirve para copiar archivos y directorios dentro del sistema de archivos (file system) de un sistema Linux.

Utilizar este comando es muy simple pues solo indicas el nombre del archivo a copiar y el nombre del archivo o directorio donde quieres que se copie, pero también tiene algunas otras funciones mediante algunos parámetros que te pueden ser útiles en un momento dado.

Para ver estos parámetros mas avanzados te mostraré ejemplos prácticos para que veas que hace el comando cp en cada uno de ellos. Recuerda que para ver como se usa cualquier comando, su sintaxis, los parámetros y su función, siempre puedes utilizar el comando man comand, en este caso man cp y también puedes usar cp –help para ver mas detalles del comando cp.

Sintaxis del comando linux cp

cp [opciones]... [-T] origen destino
cp [opciones]... origen... directorio
cp [opciones]... -t directorio origen...

Estas son algunas de las opciones que tiene el comando linux cp:

opción descripción
-a archive files
-f copia forzada al remover el archivo destino si es necesario
-i interactivo, pide confirmación del usuario antes de sobre escribir
-l enlaces en vez de copia
-L seguir enlaces simbólicos
-n no sobre escribir archivos
-R copia recursiva recursive copy (including hidden files)
-u actualizar, copia cuando la fuente es mas reciente que el destino
-v muestra mensajes informativos

Comencemos con los ejemplos y vamos a ir de los mas simples a los mas complejos.

1.- Copiar un archivo a un directorio

Este es el uso más sencillo de del comando cp que es copiar un archivo dentro de un directorio. Este uso del comando cp no requiere de opciones, solo indicar el archivo fuente y el directorio destino que puede ser una ruta absoluta o una ruta relativa.

cp archivo-01.txt /home/usuario/Downloads/tmp2/

Este mimso ejemplo se puede realizar con una ruta relativa

cp archivo.txt ./Downloads/tmp2/

 

2.- Copiar 2 (o más) archivos a un directorio

El comando linux cp permite indicar la copia de uno o más archivo que serán copiados a un directorio.

cp archivo.txt programa.py ~/bin/programa/

 

3.- Copiar todos los archivos a un directorio

Es posible utilizar los caracteres comodines * y ? para indicar que deseamos copiar cualquier nombre de archivo, en este caso todos los archivos de con los caracteres «.txt»

cp *.txt respaldo

Si se deseara realizar la copia de todos los archivos a un directorio se puede hacer con este comando:

cp * directorio

 

4.- Copiar un directorio completo

Una de las cosas que siempre se quiere hacer con el comando cp y que desconcierta a cualquier principiante es la copia de un directorio por que si no se hace correctamente arroja un error como este :

$ cp directorio ./respaldo/
cp: omitting directory ‘directorio’

Lo primero que se viene a la mente es «no se pueden copiar directorio» pero no es que no se pueda sino que un directorio es solo una lista de archivos, entonces necesitamos copiar también los archivos que hay dentro de la lista de este «archivo especial» o directorio, para hacer esto se requiere del parámetro -r, así el comando correcto es este:

cp -r directorio ./respaldo/

 

5.- Respaldar antes de sobre escribir

Es común que quieras copiar archivos con el mismo nombre y en la mayoría de las ocasiones es útil tener un respaldo del archivo que se va a sobre escribir, y créeme es buena practica siempre generar un respaldo de algo que vas a sobre escribir. Para esto el comando cp tiene una opción muy práctica que poco se conoce y es el parámetro -b o –backup y se emplea de esta forma:

cp --backup archivo.txt ./respaldo/

Al copiar «archivo.txt» al directorio «respaldo» lo que primero es generar una copia del archivo que se encuentra dentro del directorio respaldo y le agrega el caracter ~ al final y posteriormente copia y sobre escribe «archivo.txt». Si tu das un ls al directorio respaldo verías algo como esto:

$ cp --backup archivo.txt ./respaldo/
$ ls -l respaldo
-rw-r--r-- 1 lm lm 12 Jul 21 18:41 archivo.txt
-rw-r--r-- 1 lm lm 4 Jul 21 18:40 archivo.txt~

Si utilizar la opción –backup=numbered entonces se creará un nuevo archivo de respaldo cada vez que se sobre escriba el archivo que estás copiando. Aquí un ejemplo:

$ cp --backup=numbered archivo.txt ./respaldo/
$ ls -l respaldo
-rw-r--r-- 1 lm lm 12 Jul 21 19:07 archivo.txt
-rw-r--r-- 1 lm lm 4 Jul 21 18:40 archivo.txt~
-rw-r--r-- 1 lm lm 12 Jul 21 19:07 archivo.txt.~1~
-rw-r--r-- 1 lm lm 18 Jul 21 19:07 archivo.txt.~2~

 

6.- Forzar la copia

Cuando sea necesario realizar la copia de un archivo sin importar si ya existe otro archivo con el mismo nombre y se desea sobre escribir sin recibir una consulta o un mensaje de advertencia se puede utilizar el parámetro -f para forzar la copia.

cp -f archivo.txt ./respaldo/

 

7.- Recibir notificación de la copia

Cuando es necesario saber que ocurre con la copia puedes utilizar el parámetro -v con el que recibirás en pantalla un mensaje por cada archivo que se copie o en caso de algún error igual tendrás un mensaje para saber en todo momento que ocurrió. Aquí algunos ejemplos:

$ cp -v archivo.txt archivo-nuevo.txt
‘archivo.txt’ -> ‘archivo-nuevo.txt’
$ cp --backup=numbered -v archivo.txt ./respaldo/
‘archivo.txt’ -> ‘./respaldo/archivo.txt’ (backup: ‘./respaldo/archivo.txt.~3~’)

En el primer ejemplo puedes ver que se indica que «archivo.txt» fue copiado en el archivo con nombre «archivo-nuevo.txt». En el segundo ejemplo puedes ver que se trata de una copia de «archivo.txt» al directorio «respaldo» pero además se realizó un respaldo del archivo con el nombre «archivo.txt.~3~» en el mismo directorio.

 

8.- Preservar enlaces duros y simbólicos al copiar

Los enlaces duro y simbólicos son una práctica muy común en linux así que es probable que en algún momento vayas a necesitar hacer la copia de algunos archivos que en realidad son enlaces y esta opción de va a ser muy útil.

El comando cp sin parámetros copia los enlaces como un archivo en vez de copiar el enlace. Para copiar manteniendo los enlaces puedes utilizar el parámetro -d. Mira la diferencia de al comento de copiar un enlace en el siguiente ejemplo:

$ ls -l
-rw-r--r-- 1 lm lm 12 Jul 21 18:40 archivo.txt
lrwxrwxrwx 1 lm lm 11 Jul 21 19:43 enalce-archivo.txt -> archivo.txt

Aquí tenemos un enlace «enlace-archivo.txt» que apunta a «archivo.txt» y al momento de hacer una copia sin parámetros de «enlace-archivo.txt» lo que se copia es un archivo nuevo de nombre «nuevo-enlace».

$ cp enalce-archivo.txt nuevo-enalce
$ ls -l
-rw-r--r-- 1 lm lm 12 Jul 21 18:40 archivo.txt
lrwxrwxrwx 1 lm lm 11 Jul 21 19:43 enalce-archivo.txt -> archivo.txt
-rw-r--r-- 1 lm lm 12 Jul 21 19:43 nuevo-enalce

Veamos ahora la diferencia de este compoartamiento cuando se utilizar el parámetro -d

$ cp -d enalce-archivo.txt nuevo-enalce
$ ls -l
-rw-r--r-- 1 lm lm 12 Jul 21 18:40 archivo.txt
lrwxrwxrwx 1 lm lm 11 Jul 21 19:43 enalce-archivo.txt -> archivo.txt
lrwxrwxrwx 1 lm lm 11 Jul 21 19:48 nuevo-enalce -> archivo.txt

Puedes ver que ahora «nuevo-enlace» es efectivamente un enlace a «archivo.txt»

 

9.- No sobre escribir al copiar un archivo

El comando cp también tiene un parámetro para evitar que un archivo se sobre escriba al copiar un achivo, si ese archivo ya existe en la ubicación de destino y no deseas que se sobre escriba puedes utilizar la opción -n

cp -n archivo.tx ./respaldo

 

10.- Pedir confirmación antes de sobre escribir

Cuando deseas realizar la copia de uno o varios archivos y deseas que algunos si se sobre escriban y otro no puedes utilizar la opción -i que te solicita una respuesta «y» o «s» para confirmar la copia y se sobre escriba o «n» para omitir la copia de ese archivo y así evitar que se sobre escriba.

cp -i archivo ./respaldo/

En este ejemplo vemos como se solicita confirmación en ambos casos en uno respondemos que no y en otro que sí, además usamos la opción -v para tener un mensaje de confirmación de la copia. Este es el ejemplo al responder «no»

$ cp -iv archivo.txt ./respaldo/
cp: overwrite ‘./respaldo/archivo.txt’? n

El siguiente ejemplo es cuando indicamos que si deseamos que se sobre escriba el archivo.

$ cp -iv archivo.txt ./respaldo/
cp: overwrite ‘./respaldo/archivo.txt’? y
‘archivo.txt’ -> ‘./respaldo/archivo.txt’

Como vemos en este último ejemplo la línea final indica que el archivo se ha copiado al directorio «respaldo».

 

11.- Crear enlaces duros en vez de copiar

Cuando deseas crear enlaces duros en vez de copiar los archivos puedes utilizar la opción -l, el uso de este parámetro no realizará una copia del archivo sino que creará un enlace duro (o hard link) hacia el archivo.

$ cat archivo.txt
123 456 789

Si tu tienes un texto en «archivo.txt» puedes utilizar el parámetro -l para crear un enlace duro del archivo dentro del directorio «respaldo»

cp -l archivo.txt ./respaldo/enlace-duro

Si se consulta el valor de «enlace-duro»  y luego se modificas el valor de «archivo.txt» te darás cuenta que al volver valor de «enlace-duro» también cambió pues no es un archivo individual sino que apunta «archivo.txt». Mira el ejemplo:

$ cat ./respaldo/enlace-duro
123 456 789
$ echo "1234 5678 9012" > archivo.txt
$ cat ./respaldo/enlace-duro
1234 5678 9012

12.- Crear enlaces simbólicos al copiar

Los enlaces simbólicos son mas comunes y también puedes crear este tipo de enlaces cuando usas el comando linux cp, en vez de hacer copias los archivos.

$ cp -s archivo.txt enlace-simbolico
$ ls -l
-rw-r--r-- 2 lm lm 15 Jul 22 10:58 archivo.txt
lrwxrwxrwx 1 lm lm 11 Jul 22 11:14 enlace-simbolico -> archivo.txt

Es importante mencionar que con la opción -s solo se pueden hacer enlaces simbólicos en el directorio actual.

13.- Copiar sin seguir los enlaces simbólicos

Cundo copiamos algún directorio que tiene enlaces simbólicos es importante saber como queremos copiar esos enlaces. No seguir los enlaces simbólicos copiará esos enlaces y seguirán siendo enlaces hacia los archivos que apuntan y esto se logra con el parámetro -P . Mira el ejemplo:

$ ls -l
lrwxrwxrwx 1 lm lm 30 Jul 22 11:22 archivo-numeros.txt -> /home/lm/Documents/archivo.txt
drwxr-xr-x 2 lm lm 4096 Jul 22 11:13 respaldo
$ cp -P archivo-numeros.txt ./respaldo/
$ ls -l respaldo/
lrwxrwxrwx 1 lm lm 30 Jul 22 11:26 archivo-numeros.txt -> /home/lm/Documents/archivo.txt

Si te fijas la copia que se hizo dentro del directorio «respaldo» se ha copiado como un enlace simbólico que apunta al mismo archivo en la carpeta /home/lm/Documents/

14.- Copiar siguiendo los enlaces simbólicos

En ocasiones son útiles lo enlaces simbólicos pero hay ocasiones que requieres que los archivos reales estén en una ubicación, para hacer una copia de este tipo es necesario seguir los enlaces simbólicos y hacer una copia real del archivo. Para hacer esto puedes usar el parámetro -L. Aquí te muestro la diferencia respecto al ejemplo anterior.

$ ls -l
lrwxrwxrwx 1 lm lm 30 Jul 22 11:22 archivo-numeros.txt -> /home/lm/Documents/archivo.txt
drwxr-xr-x 2 lm lm 4096 Jul 22 11:13 respaldo
$ cp -L archivo-numeros.txt ./respaldo/
$ ls -l respaldo/
-rw-r--r-- 1 lm lm 12 Jul 22 11:41 archivo-numeros.txt
-rw-r--r-- 1 lm lm 15 Jul 22 10:58 enlace-duro

Si observas el archivo que estas copiando «archivos-numeros.txt» es un enlace simbólico, y al momento de copiarlo con el parámetro -L el archivo que se copia dentro del directorio respaldo es un archivo común y corriente, a diferencia del ejemplo anterior donde era también un enlace simbólico.

Fuente: LarMedina