sauvegarde temporaire

De Linux France
Aller à : navigation, rechercher

Objectif

Voici comment effectuer une « sauvegarde temporaire » du contenu d'un répertoire, destinée à permettre de restaurer rapidement des fichiers. C'est utile lorsque l'on souhaite détruire des fichiers sans être absolument certain de ne pas devoir les restaurer dans les jours qui suivront tout en étant sûr de leur utilité nulle à plus long terme.

On peut aussi employer une fonction bash (merci à M. Quercia):

del() {
 mv --backup=numbered $* ~/tmp/Archive_tmp
}

Réponse

Mise en place

  • Créer un répertoire « ~/tmp/Archive_tmp »
  • Placer le script de shell suivant dans un répertoire nommé dans votre PATH :
#!/bin/bash
#keeps a temporary archive of the current directory content 
#author: Nat Makarevitch.org
 
#installation BEGIN
#declare here the complete name of the directory where the temporary backups
#will stay
ARCHIVEDIR=$HOME/tmp/Archive_tmp/
 
#create this directory
 
#add a 'garbage collector' to your crontab:
#find tmp/Archive_tmp -type f -mtime +90 -print0|xargs -r -0 rm
 
# copy this script in a directory (in your PATH)
 
#installation END
 
if [[ ! -d $ARCHIVEDIR ]] ; then
 echo No $ARCHIVEDIR directory found, please create it
 exit 4
fi
 
##ArcName=$1
pwd=`pwd`
 
##if [[ -n "$ArcName" ]] ; then
  ArcName=`hostname --fqdn`
  DirN=`echo $pwd|tr ' /\\><&' '<B5>_'`
  ArcName="$ArcName":"$DirN"
##fi
 
dat=$(date +%Y%m%d_%H%M%S_%N)
#dat=$(date -u --rfc-3339='ns' | tr '[:space:]' '_'|tr --delete :)
 
NAMETAR=$ARCHIVEDIR"$ArcName"_"$dat".tar
 
ionice -c3 -p $$
 
touch $NAMETAR
if [[ $? -ne 0 ]] ; then
#the archive name is not legal, let's replace it with the
#basename of the current directory
    ArcName=`basename $pwd /`
    NAMETAR=$ARCHIVEDIR"$ArcName"_"$dat".tar
fi
 
if [[ -s $NAMETAR.bz2 ]] ; then
 echo Archivename $NAMETAR.bz2 already used
 exit 5
fi
 
# name of a file used to store misc infos about the local directory.
# TODO: we do not store it in the dir itself because it can be ro
infofile=`mktemp ./Archive_tmp_$dat.XXXXXXXXXXXXXX`
if [[ $? -eq 1 ]]; then
    echo Cannot create information filename \($infofile\)
    exit 6
fi
 
date>> $infofile
hostname -f > $infofile
pwd>> $infofile
ls -Rl | grep -v $infofile>> $infofile
 
tar -cShf $NAMETAR .
if [[ $? -ne 0 ]] ; then
    echo WARNING -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    echo Error detected while creating the tar file $NAMETAR
    rm $infofile
    exit 7
fi
 
nice bzip2 $NAMETAR && rm -rf $infofile &
 
echo bzip2 in progress
echo To restore: tar xjpf "$NAMETAR".bz2
echo then: less $infofile
 
exit 0
  • Dans la crontab ajouter consigne de lancement périodique d'un purgeur  :
   35 20 1,7,13,20,26 * * find ~/tmp/Archive_tmp -type f -mtime +40 -print0 | xargs -0 -r rm

Notes :

  • dans la crontab le programme « tmpwatch » peut remplacer le « find » proposé
  • on pourra préférer employer « atime » plutôt que « mtime », en ce cas attention aux options de montage du système de fichiers correspondant (en particulier noatime)

Utilisation

Se placer dans le répertoire à sauvegarder puis invoquer « Archive_tmp ». Tout son contenu (sous-répertoires compris) sera sauvegardé. Attention aux liens: tout hard link est préservé tel quel, et tout symlink suivi (c'est le fichier qu'il pointe qui est sauvegardé).

Pour restaurer : se rendre dans le répertoire « ~/tmp/Archive_tmp », déterminer quelle archive restaurer, se rendre dans le répertoire originel puis invoquer « tar xjpf ~/tmp/Archive_tmp/nom_de_l'archive ». Ne pas négliger l'option 'p'.

Origine de ce document