Script en Bash para copia de archivos recursiva (backup) de una carpeta de origen a una de destino

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

Script en Bash para copia de archivos recursiva (backup) de una carpeta de origen a una de destino

Mensaje por gbeltran »

Ejecutar en el directorio en donde se encuentra el script con 2 parámetros:

Código: Seleccionar todo

sudo sh nombre_script.sh DIRECTORIO_ORIGEN DIRECTORIO_COPIA
Aquí está (funciona):

Código: Seleccionar todo

#!/bin/bash
# Script para copiar solo archivos modificados de un directorio a otro

# Directorio de origen
origen="$1"

# Directorio de destino
destino="$2"

# Comprueba si los directorios existen
if [ ! -d "$origen" ]; then
    echo "El directorio de origen $origen no existe."
    exit 1
fi

if [ ! -d "$destino" ]; then
    echo "El directorio de destino $destino no existe."
    exit 1
fi

# Copia los archivos modificados
rsync -r --update --verbose "$origen"/ "$destino"

echo "Los archivos modificados se han copiado con éxito."
exit 0

# TODO LO QUE VIENE AHORA ES UNA EXPLICACIÓN, PARA ACORDARME

# Puedes especificar el directorio de origen y destino directamente en la línea de comandos cuando ejecutes # el script. Aquí te muestro cómo hacerlo:

# 1. Primero, abre una terminal.
# 2. Navega al directorio donde se encuentra tu script usando el comando `cd`. Por ejemplo, si tu script # está en el directorio `Documentos`, puedes usar `cd Documentos`.
# 3. Ahora puedes ejecutar tu script con los directorios de origen y destino como argumentos. Por ejemplo, si quieres copiar archivos de la carpeta `MisArchivos` 
# en tu directorio de usuario a una carpeta llamada `Copia` en eldirectorio `/tmp`, puedes usar el siguiente comando:

# ```bash
# ./nombre_del_script.sh ~/MisArchivos /tmp/Copia
# ```

# En este comando, `./nombre_del_script.sh` ejecuta tu script. `~/MisArchivos` es el directorio de origen (la tilde `~` es un atajo para tu directorio de usuario) y `/tmp/Copia` es el directorio de destino.

# Por favor, reemplaza `nombre_del_script.sh` con el nombre real de tu script de Bash.
Última edición por gbeltran el 16 Jul 2024, 10:11, editado 1 vez en total.
gbeltran
Mensajes: 321
Registrado: 13 May 2023, 01:15
Ubicación: Valencia - España
Contactar:

Re: Script en Bash para copia de archivos recursiva (backup) de una carpeta de origen a una de destino

Mensaje por gbeltran »

La sentencia if [ ! -d "$origen" ]; then... en un script de Bash se puede desglosar de la siguiente manera:

if: Este es el inicio de una declaración condicional en Bash. Ejecuta el código que sigue si la condición entre corchetes ([ ]) es verdadera.

[ ! -d "$origen" ]: Esta es la condición que se está comprobando. Se compone de varios elementos:
!: Este es un operador de negación. Invierte el resultado de la condición que sigue.

-d: Este es un operador de prueba que verifica si el argumento que sigue es un directorio.

"$origen": Esta es una variable de shell. Su valor se sustituye en tiempo de ejecución.

then: Este es el inicio del bloque de código que se ejecutará si la condición anterior es verdadera.

Por lo tanto, la sentencia completa if [ ! -d "$origen" ]; then... significa “si $origen no es un directorio, entonces…”. El código que sigue a then se ejecutará si $origen no es un directorio. Si $origen es un directorio, el código dentro de este bloque if se saltará.
gbeltran
Mensajes: 321
Registrado: 13 May 2023, 01:15
Ubicación: Valencia - España
Contactar:

Re: Script en Bash para copia de archivos recursiva (backup) de una carpeta de origen a una de destino

Mensaje por gbeltran »

Otro ejemplo de uso de rsync en ssh

Ejemplo básico de cómo usar `rsync` para copiar archivos de un directorio a otro, asegurándote de que solo se copien los archivos que son más nuevos o que no existen en el destino.

Imagina que tienes un directorio local llamado `mi_carpeta` y quieres copiar su contenido a un directorio remoto en un servidor llamado `mi_servidor` en la ruta `/ruta/destino`.

El comando sería:

Código: Seleccionar todo

rsync -av --update mi_carpeta/ usuario@mi_servidor:/ruta/destino/
Explicación del comando con las opciones:

- `-a`: Activa el modo "archivos", que preserva los permisos, las fechas de modificación, y otros atributos de los archivos.
- `-v`: Muestra información detallada sobre el proceso de copia (modo "verbose").
- `--update`: Solo copia archivos que son más nuevos en el origen que en el destino o que no existen en el destino.

Sustituye `usuario` con tu nombre de usuario en el servidor remoto y ajusta las rutas de las carpetas según sea necesario.
gbeltran
Mensajes: 321
Registrado: 13 May 2023, 01:15
Ubicación: Valencia - España
Contactar:

Re: Script en Bash para copia de archivos recursiva (backup) de una carpeta de origen a una de destino

Mensaje por gbeltran »

Copia de seguridad con cp, en vez de con rsync:
Con control de errores y creando la carpeta destino si no existiera (nota para mí: ver mi script)

Código: Seleccionar todo

#!/bin/bash

# Definimos las rutas de origen y destino
ORIGEN="/home/usuario/copias"
DESTINO="/media/usuario/data/backup"

# Mensaje de inicio
echo "Se va a realizar una copia de seguridad de la carpeta copias al disco data, carpeta backup"

# Comprobamos si la carpeta de origen existe
if [ ! -d "$ORIGEN" ]; then
    echo "Error: La carpeta de origen '$ORIGEN' no existe."
    exit 1
fi

# Comprobamos si la carpeta de destino existe, si no, la creamos
if [ ! -d "$DESTINO" ]; then
    echo "La carpeta de destino '$DESTINO' no existe. Creándola..."
    mkdir -p "$DESTINO"
    if [ $? -ne 0 ]; then
        echo "Error: No se pudo crear la carpeta de destino '$DESTINO'."
        exit 1
    fi
fi

# Realizamos la copia de seguridad
cp -r -u -v "$ORIGEN" "$DESTINO"
if [ $? -eq 0 ]; then
    echo "Copia de seguridad completada con éxito."
else
    echo "Error: La copia de seguridad falló."
    exit 1
fi
gbeltran
Mensajes: 321
Registrado: 13 May 2023, 01:15
Ubicación: Valencia - España
Contactar:

Re: Script en Bash para copia de archivos recursiva (backup) de una carpeta de origen a una de destino

Mensaje por gbeltran »

Ver tema montaje unidades y discos (mnt): viewtopic.php?t=320
Responder