comandos-linux-cp.jpg

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. Solo necesitas conocer todo el repertorio de parámetros de este comando que va más allá de solo copiar un archivo. 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.

15.- Copiar de forma recursiva

Cuando copiamos una ruta o directorio puede ser necesario copiar el directorio y todo lo que se incluya dentro de ese directorio (archivos, archivos ocultos y otros directorio dentro de este) para realizar esto se cuenta con el parámetro -R o -r (son idénticos)

cp -R directorio respaldo

16.- Copiar solo para actualizar

Al utilizar el comando linux cp con el parámetro -u se realizará la copia de los archivos solo cuando el origen sea mas reciente o el destino no exista, esto puede ser útil cuando se tenga un respaldo incremental, es decir que solo se copiarán al respaldo los archivos que sean mas recientes que los que se encuentran en el respaldo.

Para mostrar un ejemplo supongamos que tenemos un respaldo y una lista de archivos recientemente creados.

$ ls -l
-rw-r--r-- 1 lm lm 11 Jul 22 11:58 archivo.txt
-rw-r--r-- 1 lm lm 11 Jul 22 11:58 licencia
drwxr-xr-x 2 lm lm 4096 Jul 22 11:59 respaldo
-rw-r--r-- 1 lm lm 11 Jul 22 11:58 usuarios

En el respaldo solo tenemos almacenado “archivo.txt” y será necesario respaldar solo los archivos nuevos.

$ ls -l respaldo/
-rw-r--r-- 1 lm lm 11 Jul 22 11:59 archivo.txt

Para realizar la copia de los archivos mas recientes se utilizará el parámetro -u de esta forma:

$ cp -u -v archivo.txt licencia usuarios ./respaldo/
‘licencia’ -> ‘./respaldo/licencia’
‘usuarios’ -> ‘./respaldo/usuarios’

Si te fijas solo se han copiado los archivo nuevos (que no existían en el destino). Si actualizamos uno de esos archivo volvemos a ejecutar el mismo comando se copiará solo los archivos en los que el origen se mas reciente que los archivos que existen.

$ touch archivo.txt
$ cp -u -v archivo.txt licencia usuarios ./respaldo/
‘archivo.txt’ -> ‘./respaldo/archivo.txt’

Si volvemos a ejecutar el comando y el respaldo se encuentra actualizado no recibiremos nada en la salida de texto pues ningún archivo será copiado

$ cp -u -v archivo.txt licencia usuarios ./respaldo/
$

17.- Copiando con archivado

Cuando queremos copiar un directorio podemos usar -r o -R pero también podemos usar la opción -a para archivar los elementos incluidos en el directorio (archivos y carpetas) y mediante ese archivado crear una copia exacta de esos archivos y directorios, incluyendo enlaces simbólicos.

cp -a directorio respaldo

Mira este ejemplo donde hay enlaces simbólicos y al realizar la copia con -a se hace una copia de todos los archivos, incluyendo los enlaces simbólicos.

$ ls -l respaldo/
lrwxrwxrwx 1 lm lm 30 Jul 22 15:38 archivo-numeros.txt -> /home/lm/Documents/archivo.txt
-rw-r--r-- 1 lm lm 11 Jul 22 12:01 licencia
-rw-r--r-- 1 lm lm 11 Jul 22 12:01 usuarios
$ cp -a respaldo respaldo-nuevo
$ ls -l respaldo-nuevo/
lrwxrwxrwx 1 lm lm 30 Jul 22 15:38 archivo-numeros.txt -> /home/lm/Documents/archivo.txt
-rw-r--r-- 1 lm lm 11 Jul 22 12:01 licencia
-rw-r--r-- 1 lm lm 11 Jul 22 12:01 usuarios

18.- Copiar preservando los atributos del archivo.

Cuando copias un archivo muchos de sus datos se actualizan o se modifican, para realizar una copia de un archivo preservando los atributos del original se usa el parámetro -p. Los atributos de un archivo que son afectados por ese parámetro son:

  1. Tiempo y fecha de modificación
  2. Tiempo de acceso
  3. Banderas de Archivo
  4. Modo de archivo
  5. ID del usuario (UID)
  6. ID del grupo (GID)

Mira este ejemplo donde copiamos el archivo resolv.conf de forma normal.

$ cp /etc/resolv.conf ./
$ ls -l resolv.conf
-rw-r--r-- 1 lm lm 193 Jul 22 15:51 resolv.conf

Ahora ve la diferencia cuando realizas la copia del mismo archivo con el parámetro -p para preservar los atributos del archivo.

$ sudo cp -p /etc/resolv.conf ./
$ ls -l resolv.conf
-rw-r--r-- 1 root root 193 Jul 22 10:10 resolv.conf

Si haces este ejercicio en la termina y te fijas el propietario y grupo son los el usuario que estas usando, mientras que en el segundo ejemplo son de root, además también la fecha se mantiene.

19.- Eliminando el destino antes de copiar

Tal vez sea una situación muy particular pero es necesario eliminar primero el destino antes de realizar la copia de los archivos, para realizar esto, el comando linux cp tiene una opción llamada –remove-destination. Si la opción -f forzaba la copia y sobre escribía sobre el destino, este parámetro obligatoriamente elimina el archivo si ya existe en el destino y después realiza la copia.

$ cp --remove-destination -v licencia usuarios archivo-numeros.txt respaldo-nuevo/
removed ‘respaldo-nuevo/licencia’
‘licencia’ -> ‘respaldo-nuevo/licencia’
removed ‘respaldo-nuevo/usuarios’
‘usuarios’ -> ‘respaldo-nuevo/usuarios’
removed ‘respaldo-nuevo/archivo-numeros.txt’
‘archivo-numeros.txt’ -> ‘respaldo-nuevo/archivo-numeros.txt’

Para termiar…

El comando linux cp es uno de esos comandos básicos que es muy sencillo de usar, pero que tiene una aplica gama de funciones lo hacen un comando muy versátil y poderoso.

Puedes utilizar el comando man cp o cp –help para acceder a las man pages de este comando y que veas mas detalles de las opciones y características sobre el uso de este comando.

 

Fuente: comoinstalarlinux

¿Quién está en línea?

Hay 11907 invitados y ningún miembro en línea