Comando cp de Linux. Un par de trucos útiles

El comando cp en GNU/Linux sirve para copiar un archivo o carpeta trabajando en la línea de comandos. Pero esconde muchas opciones.

La línea de comandos en GNU/Linux esconde un montón de opciones y de utilidades que una vez conocidas resultan ser de lo más útiles y potentes, quizás más que muchas utilidades con una interfaz gráfica.

Veamos en este artículo un par de trucos sencillos que nos pueden ser de utilidad utilizando el comando cp (que viene de copy) y que como se puede adivinar este comando sirve para copiar archivos o carpetas de una hubicación en otra.

Este artículo es una adaptación de un artículo en inglés publicado en opensource.com bajo licencia CC BY-SA 4.0 escrito por Chris Hermansen, que puedes leer en este enlace:

La forma más sencilla y habitual de utilizar el comando cp es de la siguiente:

cp fichero1 fichero2

Esto lo que hace es copiar el archivo1 en archivo2, también podemos especificar una ruta distinta donde queremos que hubique el fichero2. Si este fichero no existían antes de ejecutar el comando, se crea el fichero. Si ya existía, entonces se sobreescribe.

Pero tal como he dicho al principio vamos a ver un par de trucos que podemos utilizar desde la terminal con el comando cp.

1.- Actualizar una segunda copia de una carpeta

Imaginemos que tenemos una carpeta en nuestro sistema que contiene una serie de archivos. Para este ejemplo imaginemos que es una carpeta donde vamos descargando las fotos de nuestro móvil (pueden ser archivos de texto, hojas de cálculo, etc)

Y de esta carpeta de vez en cuando también hacemos una copia de seguridad en otra partición de Datos que tenemos en otro disco duro. Para ello ejecutamos el siguiente comando cp con algunas opciones.

victorhck@Geeko:~/Imagenes$ cp -r Fotos_movil /run/media/Datos

El comando copia la carpeta Fotos_movil que está en la carpeta Imagenes dentro de mi /home y todo su contenido (la opción -r o “recursive” indica que debe copiar la carpeta y el contenido de la misma) dentro de la ruta /run/media/Datos que es donde mi partición está montada.

Ahora supongamos que otro día añado más fotos a la carpeta de /home/victorhck/Imagenes/Fotos_movil y para tenerlas a buen recaudo también quiero guardarlas en mi partición de respaldo dentro de Datos.

Para ello ejecutaré el siguiente comando:

victorhck@Geeko:~/Imagenes> cp -r -u -v Fotos_movil /run/media/Datos

A la opción ya conocida de -r para que copie la carpeta Fotos_movil y todo el contenido de la misma, hemos añadido la opción -u (“update“) para que actualice el contenido en la carpeta destino y sólo copie aquellas fotos o datos que no estuvieran ya en el destino. Y con la opción -v (“verbose“) el comando muestra en pantalla las tareas que va realizando.

También se pueden escribir las opciones del comando como:

cp -ruv Fotos_movil /run/media/Datos

Es decir, el comando comprueba que ficheros existen en la fuente, que no están en el destino, y esos son los que copia. También aquellos que exiten pero que en el origen están modificados y son distintos del archivo que existe en el destino. ¡El comando hace todo eso!

2.- Hacer distintas versiones de copias de seguridad

Para nuestro ejemplo imaginemos que estamos trabajando en un archivo llamado texto.md y lo estamos modificando, pero queremos tener una copia de seguridad o backup, de los distintos archivos antes de ir modificándolos, es aquí cuando el comando cp hace su magia.

cp --force --backup=numbered texto.md texto.md

En el comando lo que hacemos es copiar el mismo archivo encima de sí mismo. Esto con el comando cp no se puede hacer, pero en este caso especial queremos que sea así por tanto forzamos al comando que lo haga con la opción –force

La opción –backup=numbered le dice al comando que quiero hacer un backup del archivo indicado, y que las sucesivas copias de seguridad que haga quiero que estén numeradas consecutivamente. La primera será la 1, la segunda la 2, etc…

Ahora modificamos nuestro archivo texto.md una vez guardado volvemos a ejecutar el comando anterior para tener un nuevo archivo de respaldo. Si listamos los archivos que tenemos en nuestro equipo con el comando ls veremos que tenemos algo similar a esto:

texto.md texto.md.~1~ texto.md.~2~

Podemos comparar las diferencias con el comando diff de los archivos de respaldo numerados que hemos realizado para ver los cambios.


Espero que este par de comandos te sean útiles. Como siempre animaros a probarlos, hacer vuestras propias pruebas, y a echar un vistazo a la página man del comando donde seguro que encontraréis más opciones interesantes que os pueden ser útiles.

Además  en el blog he escrito otros tutoriales sobre otras herramientas de GNU coreutils como por ejemplo:

——————————-

18 comentarios sobre “Comando cp de Linux. Un par de trucos útiles

  1. Buenas! Cuánto tiempo hacía que no entraba por aquí… He estado bastante alejado de la blogosfera estos meses (desde que empecé a trabajar). A ver si me animo y escribo algo en el mío. Yo en general, desde que descubrí y aprendí a utilizar bien rsync, apenas he vuelto a tocar cp, salvo para cosas muy puntuales. Sobre todo para copiar archivos de un servidor a otro es muchísimo más rápido.

    Un saludo,
    Iyán

  2. Interesante opción [cp –force –backup=numbered] sobre todo cuando programas y tienes que respaldar el archivo que modificaste.

    Yo normalmente lo hago con el [cp Clase1.java Clase1.java.BAK].

    Acabo de crear un Alias para usarlo con este fin:
    alias cpbk=’cp –force –backup=numbered’

    Gracias por el aporte!.

  3. Gracias un Excelente Articulo como siempre y un gran comando.

    cp ‘shining brain of genius victorhck’ ‘to me’

    Saludos

  4. Errata: (al moderador: porf borrar los previos, al no poder editar el post acumulo errors, lo siento. espero no confundir en vez de ayudar) Es entrar al directorio-origen $ cd [directorio-origen] luego $ cp *.* -n [~/path/directorio-destino]

  5. Gracias por compartir los conocimientos.

    No conocia el uso del comando en profuncidad.

    cp -ruv Fotos_movil /run/media/Datos , me viene de perlas ya que asi no tengo que crear un script con las condiciones de si existe el archivo o no.

    Muchas gracias de nuevo.

  6. Qué bueno descubrir las potencialidades de un comando tan aparentemente sencillo como CP. He estado probando un poco, y lo único que veo es que en este caso, para que haga bien el update de una carpeta con otra (-u) éstas han de tener el mismo nombre. O al menos no he sabido cómo hacer para que no termine copiando la carpeta origen en la de destino si estas se llaman diferente. En este sentido, he encontrado más práctico rsync. Pero me ha parecido muy chulo conocer estas posibilidades de CP ¡gracias!

  7. Con el último comentario de esta web https://www.it-swarm-es.com/es/command-line/como-puedo-copiar-el-contenido-de-una-carpeta-otra-carpeta-en-un-directorio-diferente-usando-la-terminal/957234630/ He descubierto lo siguiente:

    Estando en una carpeta (carpetaA) donde queramos traer material de otra, o actualizar (update) en referencia a otra (carpetaB), habría que aplicar slash punto espacio punto para “traer”todo y que no se copie dentro de la carpeta donde estamos la carpeta a la que referenciamos. Algo así:

    pepito@pepito:~/carpetaA cp -u ~/carpetaB/. .

    Si por ejemplo estuviéramos en la carpeta de isos2021, donde guardamos en general las isos de este año, y quisiéramos actualizarlo con la carpeta de isosDescargadas, donde vamos guardando las iso que vamos descargando, habría que hacer el proceso, empezando por ubicarnos dentro de la carpeta isos2021

    pepito²pepito:~/isos2021 cp -uvr ~/isosDescargadas/. .

    Y entonces no se crearía una carpeta “isosDescargadas” dentro de isos2021, si no que haría update de isos2021 respecto a lo que se encuentre en “isosDescargadas”.

    De esta manera, por lo que entiendo, se podría actualizar una carpeta respecto a otra aunque tengan nombres distintos. Muy similar pues a hacer un rsync , vaya.

    ¡Qué potencia tiene algo tan aparentemente sencillo como CP !

Me gustaría saber tu opinión. Deja un comentario (Puedes usar MarkDown)

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Salir /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios .