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).