DavidDecotigny

ScriptBackup

Navigation

  • Rechercher un mot :

Script de backup avec rotation


Marre d'avoir des fichiers modifiés dont je perds les vieilles versions. A l'image de logrotate, voici un script qui gardera les 30 dernières versions d'un ou plusieurs fichiers :
#! /bin/sh

# Nombre de versions de backup a conserver
NBCK=30

# Parsing des options a la recherche de -h/--help
for opt in "$@" ; do
  case x"$opt" in
    x|x-h*|x--h*) prt_usg="YES" ;;
    x*) ;;
  esac
done
[ $# -ge 2 ] || prt_usg="YES"

# Affichage de l'aide
if [ -n "$prt_usg" ] ; then
    echo "Usage: $0 destdir /path/to/file1 ... /path/to/fileN" 1>&2
    exit 1
fi

destdir="$1"
shift

# Verif que le dir destination existe bel et bien
if [ ! -d "$destdir" ] ; then
  echo "Invalid dest dir $destdir" >&2
  exit 1
fi

# Copie vers destdir + rotation
for f in "$@" ; do
  bn=`basename "$f"`
  dst="$destdir/$bn"
  for nxt in `seq $NBCK -1 2` ; do
    prv=$[ $nxt - 1 ]
    [ -f "$dst.$prv.gz" ] && mv "$dst.$prv.gz" "$dst.$nxt.gz"
  done
  [ -f "$dst.0" ] && gzip -c < "$dst.0" > "$dst.1.gz"
  [ -f "$f" ] && cp "$f" "$dst.0"
done


Exemple d'utilisation dans un cron :
42 14 * * * $HOME/sbin/bckrotate.sh $HOME/backup_rotate /path/to/fileA /path/to/fileB /path/to/fileC

Tous les jours a 14:42, les fichiers /path/to/fileA & co seront copiés dans le repertoire $HOME/backup_rotate/ sous le nom fileA.0 / fileB.0 / fileC.0, et les 30 précédentes versions seront conservées sous le nom fileA.X.gz (X dans 1..30).