Back to code Bash

Respaldo diario que se verifica y borra los viejos

Comprime una carpeta con fecha, comprueba que el archivo se puede leer y conserva solo los últimos siete días.

This post is not in your language yet; you are seeing it in Spanish. The code is the same.

The problem

Un respaldo que nadie verifica es una suposición, y uno que nunca se borra llena el disco. El script tiene que hacer las dos cosas solo.

Bash
#!/usr/bin/env bash
set -euo pipefail

ORIGEN="${1:?Uso: respaldo.sh carpeta_origen carpeta_destino}"
DESTINO="${2:?Falta la carpeta de destino}"
DIAS=7

mkdir -p "$DESTINO"
archivo="$DESTINO/respaldo-$(date +%Y%m%d-%H%M%S).tar.gz"

tar -czf "$archivo" -C "$(dirname "$ORIGEN")" "$(basename "$ORIGEN")"
tar -tzf "$archivo" > /dev/null          # si no se puede listar, no es un respaldo

find "$DESTINO" -name 'respaldo-*.tar.gz' -mtime +"$DIAS" -delete
echo "Listo: $archivo ($(du -h "$archivo" | cut -f1)). Se conservan $DIAS días."

Why it is written this way

  1. set -euo pipefail hace que el script se detenga ante cualquier error en vez de seguir como si nada.
  2. ${1:?mensaje} corta con una explicación si falta el argumento.
  3. tar -tzf vuelve a leer el archivo recién creado: si está corrupto, el script falla ahí y no borra los respaldos viejos.
  4. El find borra solo lo que coincide con el patrón del propio script y tiene más de siete días.
How to try it

chmod +x respaldo.sh y corré: ./respaldo.sh /ruta/a/datos /ruta/a/respaldos. Para programarlo: una línea en crontab.

Watch out

Guardar el respaldo en el mismo disco que los datos protege de un borrado accidental, no de una falla del disco ni de un ransomware. La copia que vale está en otro lado.

Adapt it to your case with AI

The button copies this prompt with the code pasted below it. Replace the brackets with your own details and paste it into ChatGPT, Claude, Gemini or Copilot.

The prompt
Tengo este script de respaldo en Bash. Agregale: copia del archivo a [DESTINO REMOTO: otro servidor por rsync, un bucket S3, etc.], un aviso a [CANAL: correo, webhook de Slack] solo cuando falla, y un archivo de registro con fecha y tamaño de cada respaldo. Corre en [SISTEMA OPERATIVO] con cron. Que siga deteniéndose ante cualquier error.

Example written and reviewed by hand.

Share

Comments

No comments yet. Yours can be the first.

Plain text only, no links. No email is requested. Comments are reviewed before they are published.

Did you adapt it to something of yours?

Tell me what you solved with it, or what it was missing.

Keep trying

More code

See all
Darinel Ortega Online · I reply during the day
Today
Hello. I'm not selling anything here: this is for exchanging knowledge about technology.
Write whatever you like — you can send text, images or documents. Messages reach my console and I reply from there.
You are writing outside working hours. I will read you as soon as the day starts.

An open conversation to share knowledge. Messages reach my console and I reply from there.

Let us book a conversation

Pick the day and time that work for you. Thirty minutes, no sales pitch.

Video call

For a video call, just ask for one here and I'll send you the session link.