Première rédaction de cet article le 10 septembre 2010
Dernière mise à jour le 20 septembre 2010
Dans la série « Partageons nos petits scripts shell et le monde sera meilleur », voici un petit programme qui permet de renommer des fichiers journaux ou des sauvegardes, un peu comme le fait logrotate, mais sans fichier de configuration, uniquement sur la ligne de commande.
Il me sert dans le cas où j'ai besoin de garder les N dernières
copies d'un fichier. Par exemple, sur un serveur
de noms, il est utile de garder localement les dernières
versions du fichier de zone, même si celui-ci est généré depuis une
base de données, afin de pouvoir repartir rapidement en cas de pannes
comme celle de .SE
. De même, lorsqu'on
sauvegarde ses données stockées dans le nuage,
il est utile de garder les précédentes versions, au cas où la copie du
nuage ait été tronquée. Voici par exemple comment je sauvegarde mes
marque-pages chez
del.icio.us :
copy-n bookmarks-at-delicious # http://del.icio.us/help/api/ wget -O bookmarks-at-delicious --no-check-certificate \ --http-user=bortzmeyer --http-passwd=jevaispasledire \ 'https://api.del.icio.us/v1/posts/all'
copy-n
fait donc l'équivalent de :
cp $LOG.1 $LOG.2 cp $LOG.0 $LOG.1 cp $LOG $LOG.0 touch $LOG
mais en plus paramétrable (nombre de copies gardées avec l'option
-n
, mode), et en plus
robuste (le code ci-dessus plante si $LOG.3
n'existe pas), etc.
Le programme complet, normalement en shell portable, est disponible. Voici un exemple d'usage :
% copy-n -n 2 -v sources.org Moving sources.org.1 to sources.org.2... Moving sources.org.0 to sources.org.1... Copying sources.org to sources.org.0...
Outre logrotate, déjà cité (son principal avantage sur
copy-n
est l'option de compression), on peut bien
sûr préférer un VCS ou un autre programme comme rdiff-backup, suggéré par
Sébastien Sauvage, mais qui a un cahier des charges assez différent,
puisqu'il ne stocke pas les versions précédentes en clair et qu'il ne
fonctionne qu'avec des répertoires, pas de simples fichiers). Autre
possibilité, savelog,
spécifique à Debian (paquetage debianutils, mais
les sources sont disponibles), proposé par Gregory Colpart. Prévu
uniquement pour les journaux, il a quelques limites pour d'autres
utilisations mais, autrement, semble très satisfaisant. Autres
possibilités : les traditionnels cp et rsync
disposent d'options qui font la moitié du travail
souhaité. GNU cp a l'option (non-standard)
--backup
donc on peut écrire des choses comme
cp --backup=numbered monfichier masauvegarde
et
il gardera alors les précédentes versions de
masauvegarde
, agrémentées d'un
~ et d'un numéro (qui suit l'ordre inverse de
celui qui est habituel : le numéro le plus élevé est le fichier le
plus récent). Il n'y a apparemment pas de moyen de ne garder que les N
dernières versions donc on remplit le disque petit à petit. C'est
encore pire avec rsync qui ne permet de garder que la toute dernière
version (rsync --backup --backup-dir=backups monfichier masauvegarde
). Les autres
suggestions de logiciels et
argumentations sur les raisons du choix sont les bienvenues.
En attendant, merci à Mathieu Arnold, Marc Baudoin et Kim-Minh Kaplan pour leur aide en programmation shell, surtout pour les calculs arithmétiques et à Jean-Philippe Pick pour sa maîtrise de cp.
Version PDF de cette page (mais vous pouvez aussi imprimer depuis votre navigateur, il y a une feuille de style prévue pour cela)
Source XML de cette page (cette page est distribuée sous les termes de la licence GFDL)