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:
- Tiempo y fecha de modificación
- Tiempo de acceso
- Banderas de Archivo
- Modo de archivo
- ID del usuario (UID)
- 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