SAC
:
Stockage, Archivage et Compression
partie 2 / 3 : Archivage (gh)
Retour à la page principale de (gH)Quelle est la différence entre enregistrer, archiver et compresser ?
Enregistrer, c'est simplement passer de la mémoire vive à une mémoire de stockage, c'est-à-dire schématiquement de l'écran au disque dur. Enregistrer consiste à garder sous forme d'un fichier ce qu'on visualise.
Sauvegarder, c'est garder une copie des fichiers enregistrés.
Archiver, c'est se préoccuper de la pérennité et de la diffusion des informations, les rendre disponibles pour une communauté, être capable de les retrouver, de les lister, les synthétiser, les imprimer... c'est donc en quelque sorte une sauvegarde orientée vers l'organisation des informations et des fichiers avec une volonté de communiquer et de retrouver les informations.
Compresser, c'est réduire la taille des fichiers, avec ou sans perte d'information. C'est l'objet de la page suivante.
Quel archiveur utiliser pour Windows, Linux ? et surtout, pourquoi ?
Une technique simple d'archivage consiste à regrouper des fichiers qui "doivent être ensemble" au sein d'un même fichier, nommé à juste titre "archive" des fichiers. Une commande unix nommée tar et un exécutable pour windows nommé tar.exe répondent parfaitement à ce besoin. Ces programmes mettent bout à bout les fichiers dans un fichier dont l'extension est .tar ; il s'agit donc d'une copie des fichiers, avec concaténation. L'origine du mot tar vient de Tape ARchive car dans les débuts de l'informatique, on sauvegardait sur bande ("tape" en anglais).
Fournir le fichier .tar garantit que les fichiers resteront ensemble. Imaginons par exemple qu'on veuille absolument utiliser un fichier XML comme films.xml avec sa feuille de style (ou plutot son fichier de transformation XSL indiquée explicitement en ligne 2) nommée titres.xsl. Comme les deux fichiers ne sont pas proches alphabétiquement et comme il n'y a aucune raison qu'ils aient la même date et heure de stockage, un explorateur de fichiers ne les montrera certainement pas côte à côte. Recopier le fichier XML seul le rend inutilisable. Mettre les deux fichiers dans une archive évite ce genre d'inconvénients. Vous pouvez le vérifier en utilisant l'archive nommée cinema.tar.
Comme archiver des fichiers c'est effectuer une copie des fichiers, les mêmes problèmes qu'avec une copie classique se posent pour l'archivage :
- comment utiliser un chemin absolu ou relatif pour l'archive ?
- comment connaitre le contenu de l'archive ?
- comment mettre à jour l'archive ?
- comment numéroter automatiquement les copies ?
- comment transférer automatiquement les copies ?
- comment diffuser automatiquement les copies ?
- comment "désarchiver" ?
- comment archiver en automatique à date fixe et à heure fixe ?
- comment déclencher l'archivage à distance ?
Nous réserverons la partie automatisation à la section suivante mais nous allons détailler ici quelques options de la commande tar pour répondre à ces questions.
Il faut utiliser la commande
tar -cvf NOM_ARCHIVE NOM_FICHIERS pour créer une archive (c comme Create, v comme Verbeux, f comme Fichier). Par exemple, pour créer cinema.tar nous avons écrit, dans le répertoire contenant ces deux fichiers
tar -cvf cinema.tar films.xml titres.xsl Pour connaitre le contenu d'une archive, la commande est tar -tvf (t comme Test, v comme verbeux, f comme Fichier).
L'utilisation d'un chemin absolu ou relatif pour archiver est un choix. Par défaut tar utilise les chemins relatifs ce qui permet d'archiver tout un répertoire et ses sous-répertoires avec la commande
tar -cvf NOM_ARCHIVE NOM_REPERTOIRE/* L'option u (au lieu de c ou t) permet de mettre à jour l'archive (u comme Update).
L'option x (au lieu de c, t ou u) permet d'extraire les fichiers de l'archive (x comme eXtract).
La numérotation des archives, leur transfert ou leur diffusion automatique relèvent de la section suivante nommée automatisation.
Comment automatiser et personnaliser l'archivage en ligne de commande ?
Le premier niveau d'automatisation est celui qui consiste à savoir définir des raccourcis-clavier, des raccourcis-commandes et des raccourcis-icones alors que le second niveau est de savoir écrire des scripts techniques comme l'archivage autoincrémental. De façon à proposer des solutions multi-systèmes d'exploitation, nous conseillons de programmer en Rexx, Perl ou Tcl /Tk. Pourquoi ces langages plutot que C, C++ ou Java ? Simplement parce que les programmes d'automatisation de commandes sont souvent courts, et que les langages que nous proposons sont interprétés, peu ou pas typés explicitement, "auto-initialisants" et donc rapidement modifiables et transportables (il n'y a que le "source" à échanger et il n'y a pas à recompiler). Les quelques exemples qui suivent devraient convaincre de la vitesse et de la facilité de développement
Un raccourci-clavier est une suite de touches qui déclenchent une action, un logiciel... Par exemple sous Windows-Xp la touche F3 lance l'explorateur de fichiers standard en mode recherche, la combinaison <Ctrl> et <+> augmente la police de caractères sous Firefox 3 (mais pas les images). Un logiciel comme WinKey permet de gérer rapidement les combinaisons de touches pour XP. Voici par exemple une liste de touches personnelles (cliquer pour aggrandir) :
et le détail de la gestion de la combinaison <Windows>, <Ctrl> et <d> :
Un raccourci-commande est une commande chargée en mémoire ce qui évite de la recharger sur disque. Sous Dos/Windows on peut les définir avec ced, doskey... qui gèrent aussi le rappel des lignes de commande alors que sous Linux avec bash on les définit comme des alias. Par exemple pour dire que taper la lettre b puis la touche "return" doit exécuter la commande cd ... on écrira syn b 'cd ..' pour ced et alias 'b=cd ..' pour bash. On peut ainsi raccourcir copy (ou même cp) en c, move en m, dir et ls -a en d etc. On notera que les alias de bash sont très sophistiqués et gèrent bien les paramètres... Un utilisateur qui passe la moitié de son temps sous Dos et l'autre moitié sous Linux viendra tout naturellement inventer les raccourci-commandes cp et ls sous Window, dir et copy sous Linux..
Un raccourci-icone est une icone affichée sur l'écran ("bureau" ou fond d'écran, ou dans une fenêtre prévue à cet effet) qui exécute une action spécifique. On peut souvent associer une combinaison de touches à l'icone, à condition de ne pas associer la même combinaison de touches à deux icones distinctes. Voici le panneau de définition de Firefox sous Windows XP
et une partie du panneau de sélection d'une icone toujours sous Windows XP
L'équivalent sous Linux avec KDE pour le choix de l'application ressemble à :
et celui pour le choix de l'icone à :
On notera que ces notions de raccourcis (clavier, commande, icones) sont souvent disponibles aussi pour les "meilleurs" logiciels en association avec des barres de menus, barres d'outils (barre d'icones), barre[s] de commande, la programmation du logiciel se faisant suivant les cas avec VBA, Lisp, Rexx, etc. en particulier pour les éditeurs comme emacs, sedit...
Premier exemple d'automatisation : numérotation de l'archive
On voudrait qu'à l'exécution du script archcd il y ait une production automatique de l'archive pour tous les fichiers de type xml avec numérotation de l'archive. Par exemple la première fois que le script est exécuté, on produira l'archive lesxml001.tar ; la seconde fois, ce sera lesxml002.tar etc.
L'algorithme de base ressemble certainement àaffecter numarchive <-- 1 construire nomarchive à partir de numarchive tant_que le fichier nomarchive existe affecter numarchive <-- numarchive + 1 construire nomarchive à partir de numarchive fin tant_que le fichier nomarchive existe exécuter la commande tar pour les fichiers indiqués afficher un message indiquant que l'archivage est fait
dont voici la traduction en Rexx (fichier archcd.rex)/* utilisation : regina archcd.rex */ numarchive = 1 nomarchive = "lesxml"||rexxut("formatZero^"numarchive"^3")||".tar" do while fileut("existsFile^"nomarchive) numarchive = numarchive + 1 nomarchive = "lesxml"||rexxut("formatZero^"numarchive"^3")||".tar" end /* fin de tant que */ specfic = "*.xml" "tar -cf " nomarchive specfic say " archivage des fichiers " specfic " dans " nomarchive "terminée"
Le texte Perl correspondant (fichier archcd.pl) est un peu plus court :
# /* utilisation : perl archcd.pl */ $numarchive = 1 ; $nomarchive = "lesxml".sprintf("%03d",$numarchive).".tar" ; while (-s $nomarchive) { $numarchive++ ; $nomarchive = "lesxml".sprintf("%03d",$numarchive).".tar" ; } ; # fin de tant que $specfic = "*.xml" ; system("tar -cf $nomarchive $specfic") ; print " archivage des fichiers $specfic dans $nomarchive terminée\n" ;
Enfin, le texte Tcl/Tk (fichier archcd.tcl) permet d'afficher une fenêtre qui prévient que l'archivage est terminé :
# /* (gH) v0.72 TimeStamp (dos) : 12 Octobre 02 11:30 */ # /* utilisation : wish archcd.tcl */ set numarchive 1 set nomarchive "lesxml[format "%03d" $numarchive].tar" while { [file exists $nomarchive] } { set numarchive [incr numarchive] set nomarchive "lesxml[format "%03d" $numarchive].tar" } ; # fin de tant que set specfic "*.xml" set rc [exec tar -cvf $nomarchive $specfic ] label .okarch -text " archivage des fichiers $specfic dans $nomarchive terminée." \ -fg "blue" -bg "yellow" -font { Arial 24 bold } pack .okarch after 5000 exit
Voici les fenêtres correspondantes (en haut sous Windows, en bas sous Linux)
On notera au passage que sous Windows la commande tar impose un chemin d'accès c'est pourquoi dans les programmes précédents il faut mettre .\*.xml au lieu de *.xml ce qui s'écrit
specfic = ".\*.xml" en Rexx, $specfic = ".\*.xml" en Perl, set specfic ".\\*.xml" en Tcl/Tk.
Deuxième exemple d'automatisation : choix du ou des répertoires à sauvegarder
Imaginons maintenant que l'on veuille archiver les fichiers du lieu 1, du lieu 2 ou des deux à la fois. Par exemple, il peut s'agir du répertoire ~/public_html/Farcomp (que nous désignerons par le mot "sac") et du répertoire /home/info/gh/Crs/Stat/Asi que nous désignerons par le mot "statasi". On s'attend à ce que l'utilisateur tape en ligne de commande
archglob sac pour le lieu 1 archglob statasi pour le lieu 2 archglob sac statasi pour les deux lieux à la fois
pour les programmes Rexx et Perl et qu'il clique sur l'un des quatre boutons suivants pour l'interface Tcl/Tk que ce soit sous Linux :
ou sous Windows :
Comme la commande tar accepte plusieurs spécifications de fichiers l'automatisation revient ici soit à gérer les paramètres soit les boutons afin de remplir correctement la variables specfic. Ce qui s'écrit en Rexx (fichier archglob.rex)
/* table de hachage des lieux */ courts = "sac statasi" longs = "~/public_html/Farcomp /home/info/gh/Crs/Stat/Asi" lieu. = "" /* valeur par défaut */ do idl=1 to words(courts) racco = word(courts,idl) lieuc = word(longs, idl) lieu.racco = lieuc end /* fin pour idld de 1 à mots(courts) */ /* gestion des paramètres */ parse arg ligp specfic = "" do idm=1 to words(ligp) parmc = word(ligp,idm) lieuc = lieu.parmc if lieuc ="" then do say " erreur : paramètre 'parmc' inconnu'" exit(-1) end ; else do specfic = specfic lieuc||"/*.xml" end ; end /* fin de pour idm = 1 to mots(ligp) */ if specfic="" then do say "aucun paramètre valide ? vous pourriez utiliser " courts end ; else do say " spécification[s] pour l'archive : " say " " specfic end ;
et en Perl (fichier archglob.pl) :# table de hachage des lieux %lieu = ("sac" => "~/public_html/Farcomp", "statasi" => "/home/info/gh/Crs/Stat/Asi" ) ; @courts = keys %lieu ; # gestion des paramètres foreach $idp (@ARGV) { $specfic .= $lieu{$idp}."/*.xml " if (exists $lieu{$idp}) ; } ; # fin de pour idp = 1 to mots(ARGV) if ($specfic eq "") { die("aucun paramètre valide ? vous devez utiliser les mots de '@courts' ") ; } else { print "spécification[s] pour l'archive : \n $specfic\n\n" ; } ; # fin de si
Voici maintenant la partie interface pour Tcl/Tk du fichier archglob.tcl :
wm title . " Choix du lieu d'archivage" # tableau pour simuler une table de hachage set courts "sac statasi" set longs "~/public_html/Farcomp /home/info/gh/Crs/Stat/Asi" for { set idm 0 } { $idm < [llength $courts] } { set idm [incr idm] } { set racco [lindex $courts $idm] set lieuc [lindex $longs $idm] set lieu($racco) $lieuc } ; # fin pour idm # boutons frame .choix set cfgBout "-font { Arial 14 bold } -width 10 -fg \"yellow\" -bg \"blue\" " eval "button .choix.lieu1 -text [lindex $courts 0] \ $cfgBout -command { specf [lindex $courts 0] } " eval "button .choix.lieu2 -text [lindex $courts 1] \ $cfgBout -command { specf [lindex $courts 1] } " eval "button .choix.lieux -text \"les deux\" \ $cfgBout -command { specf \"$courts\" } " frame .exit button .exit.bout -text "exit" -font { Arial 14 bold } \ -width 10 -fg "red" -bg "yellow" -command exit pack .choix -side top pack .exit -side bottom pack .choix.lieu1 .choix.lieu2 .choix.lieux -padx 15 -pady 20 -side left pack .exit.bout -padx 15 -pady 20 # touche rapide pour quitter bind . <q> exitet le sous-programe de gestion des boutons :proc specf { ligp } { global lieu set specfi "" foreach idp $ligp { set specfi "$specfi $lieu($idp)" } ; # fin de pour chaque label .spec -text " specifications : $specfi " \ -fg "blue" -bg "yellow" -font { Courier 18 bold } destroy .choix .exit pack .spec after 5000 exit } ; # fin de procédure specfVoici ce qu'affiche le script si on sélectionne le bouton "les deux" ;
Compléments sur les langages de script
Si Awk (pour Unix) et Rexx (chez IBM) furent les précurseurs, suivis par Gawk (pour Linux), Regina (version libre multi-os de Rexx), Tcl/Tk et Perl, depuis le début des années 2000 on dispose de "nouveaux" langages de script, à savoir Php, Ruby et Python. Il faut également inclure un certain "renouveau" de Javascript notamment grâce à la "technologie AJAX" pour laquelle X est mis pour... XML, évidemment.
Un langage de script est souvent libre et s'installe rapidement (quand il n'est pas déjà préinstallé avec le système ou un autre logiciel). On peut l'apprendre en une heure et ces langages se révélent totalement adaptés à une tâche particulière, comme par exemple ror -- ils sont donc imbattables sur cette tâche. C'est pourquoi ces langages de programmation sont parfois considérés comme des "petits langages spécifiques", par rapport aux "grands langages généraux" que sont C et Java.
Un langage de scripts, généralement interprété, utilise souvent "à donffe" (à fond) les expressions régulières, les tables de hachage, la programmation objet et les "glob fichiers", ce qui le rend presque indispensable pour la gestion courante des fichiers et des répertoires, voire pour le Data Mining et le Web Mining. La plupart du temps multi-os, il suffit de copier le code-source du script pour l'exécuter d'une machine à l'autre (sans recompilation). Citons par exemple BioPerl et BioPython dans la communauté de la bioinformatique. On trouvera sur notre page de "tuteurs" quelques introductions rapides à certains de ces langages de script.
Signalons que Tk, la sur-couche graphique de Tcl s'intégre facilement à d'autres langages de scripts. Par exemple, Perl/Tk et Rexx Tk permettent de construire en peu de temps des interfaces graphiques simples ("simple GUI") pour de petites applications.
Pour conclure, on remarquera que s'il faut en plus tracer, analyser, modéliser des données, le logiciel libre R fournit à la fois un environnement logiciel et un langage de commandes qui est aussi un "vrai" langage de script et un "vrai" langage de programmation. R devient de plus en plus LA référence pour les calculs statistiques : après le logiciel Statistica qui vient de décider d'incorporer une interface pour le logiciel R : statsoft_Rlanguage, c'est au tour de Sas d'inclure une interface équivalente : sas_studio_Rinterface. Pour mémoire, on pouvait déjà accéder à R via Excel : Excel-Spreadsheet-Interface-Statistics. Par contre SPSS avait fait le choix d'intégrer le langage de script python depuis la version 14 (mais python ne fait pas de statistiques...) : http://www.spsstools.net/python.htm SPSS a toutefois un "plug-in" pour le logiciel R depuis la version 16, mais qui ne fournissait une interface que pour les graphiques.
Sur les ressemblances et les différences entre perl et php, on pourra consulter ce tableau synoptique et l'article php in contrast to perl.
Exercices associés à cette page