Bash de copia de seguridad recursiva de tu usuario a carpeta disco secundario

Foro sobre GNU Linux
Responder
gbeltran
Mensajes: 315
Registrado: 13 May 2023, 01:15
Ubicación: Valencia - España
Contactar:

Bash de copia de seguridad recursiva de tu usuario a carpeta disco secundario

Mensaje por gbeltran »

Copiar la carpeta tu usuario de Linux a una carpeta de un disco secundario. En mi caso disco denominado data y carpeta backup. Se copiarán recursivamente (-r) todos los archivos y carpetas, excepto los que ya están actualizados (-u) y se mostrará el proceso (-v). Lo llamo backup.sh y lo guardo en mi directorio personal (en mi caso, guillermo):

Código: Seleccionar todo

#!/bin/bash
echo "Se va a realizar una copia de seguridad de tu usuario al disco data, carpeta backup"
cp -r -u -v /home/guillermo /media/guillermo/data/backup
Recuerda cambiar permisos al archivo .sh para poder ejecutarlo:

Código: Seleccionar todo

chmod +x backup.sh
Ejecutarlo:

Código: Seleccionar todo

./backup.sh

Explicación del código:

Código: Seleccionar todo

cp -r -u -v /origen /destino
Desglosando el comando cp -r -u -v
El comando cp en Bash es una herramienta esencial para copiar archivos y directorios en sistemas Linux. Las opciones -r, -u y -v añaden funcionalidades específicas a esta operación básica. Vamos a analizar cada una de ellas:

cp

Función: Copiar archivos y directorios.
Sintaxis básica: cp [opciones] origen destino

-r (recursivo)

Función: Copia de forma recursiva todos los archivos y subdirectorios dentro de un directorio.
Ejemplo: cp -r directorio1 directorio2 copiará todo el contenido de directorio1, incluyendo subdirectorios, a directorio2.

-u (actualizar)

Función: Copia únicamente los archivos que son más recientes que los archivos de destino existentes.
Ejemplo: cp -u archivo1 destino copiará archivo1 a destino solamente si archivo1 es más reciente que un archivo con el mismo nombre en destino.

-v (verbose)

Función: Muestra detalles de la copia, como los nombres de los archivos que se están copiando.
Ejemplo: cp -v archivo1 destino mostrará mensajes como "copiando archivo1 a destino".

Combinando las opciones

Al utilizar cp -r -u -v, estás instruyendo al sistema a:

Copiar de forma recursiva: Todos los archivos y subdirectorios de un directorio.
Actualizar solo si es necesario: Copiar únicamente los archivos más recientes.
Ser detallado: Mostrar el progreso de la copia en la pantalla.

Ejemplo práctico


Supongamos que tienes un directorio llamado "proyectos" y deseas hacer una copia de seguridad en un directorio llamado "backup". Podrías utilizar el siguiente comando:

Código: Seleccionar todo

cp -r -u -v proyectos/ backup/
Usa el código con precaución.

Esto copiará todos los archivos y subdirectorios de "proyectos" a "backup", pero solo actualizará los archivos que han sido modificados desde la última copia. Verás una lista detallada de todos los archivos que se están copiando en la terminal.

En resumen:

cp: Comando básico de copia.
-r: Copia de forma recursiva.
-u: Actualiza solo los archivos más recientes.
-v: Muestra información detallada.

Cuándo utilizar este comando:


Crear copias de seguridad: Copiar directorios completos a un lugar seguro.
Sincronizar directorios: Mantener dos directorios con el mismo contenido, actualizando solo los archivos modificados.
Mover archivos de forma selectiva: Copiar únicamente los archivos que han sido alterados desde la última copia.

Observaciones:


Sobrescritura: Si intentas copiar un archivo a un lugar donde ya existe un archivo con el mismo nombre, el archivo existente será sobrescrito, a menos que la opción -u lo evite.
Permisos: Los permisos de los archivos y directorios copiados se mantendrán.
Enlaces simbólicos: El comportamiento con los enlaces simbólicos puede variar según tu distribución de Linux.

Al comprender estas opciones, puedes utilizar el comando cp de manera más eficiente y segura en tus scripts y tareas diarias.

NOTA: Algunos archivos es posible que no se copien por tema permisos, pero son de cache, nada más.
Ver esto: https://www.redeszone.net/tutoriales/se ... ar-tareas/

Programar una tarea con `cron` y `crontab` en un sistema Linux:

1. Abre la terminal.
2. Escribe crontab -e para editar el archivo crontab del usuario actual.
3. Se abrirá el archivo crontab en el editor de texto predeterminado. Aquí es donde puedes agregar, editar o eliminar tareas programadas.
4. Por ejemplo, ara ejecutar un script bash todos los días a las 12:30 horas, puedes agregar la siguiente línea al final del archivo:

Código: Seleccionar todo

30 12 * * * /ruta/al/tu/script.sh
Donde /ruta/al/tu/script.sh es la ruta completa al script bash que quieres ejecutar.
5. Guarda y cierra el archivo.
Aquí está el desglose de la sintaxis de la línea agregada:
- 30 12 * * * : Esto especifica cuándo se ejecutará la tarea. En este caso, `30 12` significa que la tarea se ejecutará todos los días a las 12:30 horas.
- /ruta/al/tu/script.sh: Este es el comando que se ejecutará en el horario especificado.

Por último, asegúrate de que tu script bash tenga permisos de ejecución. Puedes hacer esto con el comando chmod +x /ruta/al/tu/script.sh.
Última edición por gbeltran el 31 Jul 2024, 22:21, editado 4 veces en total.
gbeltran
Mensajes: 315
Registrado: 13 May 2023, 01:15
Ubicación: Valencia - España
Contactar:

Re: Bash de copia de seguridad recursiva de tu usuario a carpeta disco secundario

Mensaje por gbeltran »

Versión en Windows: viewtopic.php?t=224
gbeltran
Mensajes: 315
Registrado: 13 May 2023, 01:15
Ubicación: Valencia - España
Contactar:

Re: Bash de copia de seguridad recursiva de tu usuario a carpeta disco secundario

Mensaje por gbeltran »

Con archivo de log (que ubico en el dispositivo externo):

Código: Seleccionar todo

#!/bin/bash
echo "Se va a realizar una copia de seguridad de /Documentos/Debian_Docs al dispositivo externo"
cp -r -u -v /home/guillermo/Documentos/Debian_Docs /media/guillermo/dispositivo_externo >> /media/guillermo/dispositivo_externo/logfile.log 2>&1
En este script, >> media/guillermo/dispositivo_externo/logfile.log 2>&1 redirige tanto la salida estándar (stdout, representada por 1) como la salida de error (stderr, representada por 2) al archivo logfile.log. El operador >> se usa para anexar la salida al archivo en lugar de sobrescribirlo.

ME QUEDO CON ESTA OPCIÓN
Si quieres ver la salida tanto en la terminal como en el archivo de log, puedes usar el comando tee:

Código: Seleccionar todo

#!/bin/bash
echo "Se va a realizar una copia de seguridad de la carpeta Documentos al disco data, carpeta backup"
cp -r -u -v /home/guillermo/Documentos/Debian_Docs /media/guillermo/dispositivo_externo 2>&1 | tee -a /media/guillermo/dispositivo_externo/logfile.log
echo "Copia realizada"
En este script, `2>&1 | tee -a /media/guillermo/dispositivo_externo/logfile.log` redirige tanto la salida estándar (`stdout`, representada por `1`) como la salida de error (`stderr`, representada por `2`) al comando `tee`, que a su vez escribe la salida tanto en la terminal como en el archivo `logfile.log`. El operador `-a` se usa con `tee` para anexar la salida al archivo en lugar de sobrescribirlo.
Última edición por gbeltran el 01 Ago 2024, 10:38, editado 1 vez en total.
Guillermo
Site Admin
Mensajes: 302
Registrado: 13 May 2023, 00:32
Ubicación: Valencia - España
Contactar:

Re: Bash de copia de seguridad recursiva de tu usuario a carpeta disco secundario

Mensaje por Guillermo »

##Automontar USB al iniciar PC en Linux para que esté disponible para el backup, sin tener que abrirlo primero:

Pasos para que en Debian (o cualquier Linux) se monte automáticamente una memoria USB al iniciar el PC:

1. Identificar tu dispositivo USB: Primero, necesitas identificar el dispositivo USB que quieres montar automáticamente. Puedes hacerlo utilizando el comando lsblk o [/b]fdisk[/b]. Por ejemplo:

Código: Seleccionar todo

sudo fdisk -l
Buscar la entrada que corresponda a tu memoria USB. Podría ser algo como /dev/sdb1.

2. Crear un punto de montaje: Necesitarás un directorio donde montar la memoria USB. Puedes crear uno con el comando mkdir, por ejemplo:

Código: Seleccionar todo

sudo mkdir /media/usb
3. Obtener el UUID del dispositivo: El UUID (Universally Unique Identifier) es un identificador único para el dispositivo que no cambia aunque conectes el dispositivo en un puerto diferente. Puedes obtenerlo con el comando blkid:

Código: Seleccionar todo

sudo blkid
Buscar la entrada correspondiente a tu dispositivo USB y anota el UUID.

4. Editar el archivo fstab: El archivo [/b]/etc/fstab[/b] contiene las instrucciones para el montaje automático de dispositivos. Vamos a añadir una entrada para tu memoria USB. Abre el archivo con un editor de texto como nano:

Código: Seleccionar todo

sudo nano /etc/fstab
Añadir una línea al final del archivo con el siguiente formato:

Código: Seleccionar todo

UUID=tu-uuid /media/usb vfat auto,nofail,noatime 0 0
NOTA: el sistema de ficheros debe ser el que tenga el USB. En mi caso la he formateado como ext4, por lo tanto, quedaría así:

Código: Seleccionar todo

UUID=tu-uuid /media/usb ext4 auto,nofail,noatime 0 0
Reemplazar tu-uuid con el UUID que corresponde al USB. Guardar el archivo y cerrar el editor.

5. Montar el dispositivo: Ahora puedes montar el dispositivo con el comando [/b]mount[/b]:

Código: Seleccionar todo

sudo mount -a
Y por último, reiniciar el demonio:

Código: Seleccionar todo

systemctl daemon-reload
Con estos pasos, la memoria USB se montará automáticamente cada vez que se inicie tu PC.

NOTA:
Ahora he de modificar mi bash de copia (backup.sh) en el Debian (en Ubuntu lo dejo como antes). El destino será /media/usb64 (que es como he montado el USB). Funciona!
Responder