sauvegarde temporaire
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'.