Ce document a été produit par HEVEA.
Votre browser peut avoir a être configuré pour afficher correctement certains symboles.
Reportez-vous à la
documentation d'HEVEA.

Licence d'informatique
Module de C/Unix
Projet Unix

stfs --- Search Though FileS

Philippe Marquet

Octobre 1997

Ce document est disponible sous forme d'un fichier PostScript compressé.





La commande stfs (Search Though FileS) proposée ici est inspirée de la commande glimpse développée par Udi Mander, Sun Wu, et Burra Gopal, University of Arizona, Tuscon, AZ (http://glimpse.cs.arizona.edu/).

La commande stfs sera développée en Bourne Shell (sh).

  Recherche d'informations

La recherche d'informations dans un système de fichiers Unix recouvre l'utilisation de plusieurs outils. Les commandes de recherche de type grep sont rapides si la recherche se limite à un domaine restreint (fichiers peu nombreux et peu volumineux). La recherche à l'aide d'outils basés sur des index nécessite la construction de fichiers d'index volumineux (typiquement de l'ordre de 50 à 300% des informations indexées).

La commande stfs est une combinaison de ces deux approches. L'utilisation de cette commande est ainsi possible même pour des recherches dans des systèmes de fichiers personnels pour lesquels l'utilisateur ne peut pas doubler l'utilisation de son espace disque par la création de volumineux fichiers d'index.

La méthode de recherche utilisée au sein de stfs est une recherche à deux niveaux. La mise en place de cette méthode est motivée par le fait que les recherches séquentielles telles que celle effectuées par grep sont efficaces pour des recherches dans des textes de taille raisonnable. Il n'est donc pas nécessaire d'indexer exactement l'ensemble des mots. L'approche de la recherche à deux niveaux est de ne pas mémoriser dans un fichier d'index l'emplacement exact des mots mais un pointeur vers une zone dans laquelle la réponse précise sera trouvée. Ensuite, une recherche séquentielle de type grep sera utilisée dans cette zone pour présenter la solution exacte.

  Construction de l'index

L'espace d'information est un ensemble de fichiers textes. Un texte est consisté d'une séquence de mots séparés par les délimiteurs habituels (espace, fin de ligne, point, virgule...).

La première phase de l'indexation est de diviser l'espace d'information en blocs. Cette division est faite de manière à ce que les blocs soient de taille équivalente. De manière générale, le nombre de blocs doit être inférieur à une valeur donnée, en effet les blocs seront adressés par une clé qui sera conservée dans le fichier d'index. Afin de faciliter les choses dans le cadre de notre projet développé en shell, les clés seront représentées par un caractère. Les caractères imprimables étant limités à 94 caractères, nous nous limiterons à 94 blocs.

L'ensemble de l'espace d'information est analysé mot par mot pour construire un index. À l'inverse des index habituels dans lesquels chaque occurrence d'un mot est indexée par un pointeur sur sa position exacte, dans notre approche tous les mots sont indexés, mais pas chacune des occurrences. Une entrée dans l'index contient un mot et la liste des blocs dans lesquels le mot apparaît. Même si un mot apparaît plusieurs fois dans un bloc, seul l'index du bloc apparaît dans l'index, et une seule fois.

  Recherche d'un mot

La recherche est faite en deux phases. Premièrement, on réalise une recherche dans l'index pour identifier l'ensemble des blocs qui peuvent satisfaire la requête. Ensuite une recherche dans ces blocs est faite de manière indépendante.

La recherche dans l'index est faite de manière séquentielle avec grep et non en utilisant des algorithmes de hashage. L'avantage d'une telle approche est la possibilité d'utiliser les expressions régulières de grep et donc de ne pas seulement rechercher des mots au sens strict du terme.

  Syntaxe de la commande stfsindex

la commande stfsindex crée un index pour les fichiers textes d'une arborescence dont le nom de la racine est passé en paramètre (par défaut, stfsindex indexe le répertoire $HOME de l'utilisateur) :
stfsindex    [-z]    [-l]    [dirname]

L'option -z indique à stfsindex de considérer les fichiers textes et les fichiers textes compressés.

L'option -l signale de ranger dans un fichier de log l'évolution de l'exécution de la commande (nom des fichiers traités, liste des fichiers n'ayant pu être indexés suite à une erreur...) afin de pouvoir localiser d'éventuelles erreurs.

  Implémentation de la commande stfsindex

Préalablement à l'indexation d'un fichier, la commande stfsindex doit déterminer si le fichier est un fichier texte. Elle utilise pour cela la commande file (1).

Si l'option -z est présente, les fichiers compressés ou codés sont décompressés/décodés et considérés comme des fichiers textes si le résultat de la décompression est un fichier texte. Les utilitaires de décompression utilisés sont uncompress (1) et gunzip (1). L'utilitaire de décodage considéré est uudecode (1).

La partition des fichiers à indexer en blocs peut être réalisée de la manière suivante. La somme des tailles des fichiers à indexer est calculée ; une taille moyenne des blocs en découle. Les fichiers sont combinés jusqu'à atteindre cette taille et un nouveau bloc est commencé.

Le résultat de l'indexation doit fournir : Ces informations seront rangées dans des fichiers .stfs.* situés dans le répertoire de login de l'utilisateur. Il est possible d'organiser ces informations de multiples manières. Nous précisons ici une de ces possibilités.

Les informations sont réparties dans les fichiers :
$HOME/.stfs.index
est structuré en lignes. Une ligne débute par un mot suivi d'un séparateur (un espace) et de la liste des codes (caractères) des blocs dans lesquels le mot apparaît.
$HOME/.stfs.filenames
contient la liste des fichiers indexés à raison d'un nom (absolu) de fichier par ligne. Un caractère supplémentaire code le fait que le fichier est compressé/codé.
$HOME/.stfs.blocks
définit les ensembles de fichiers appartenant à un bloc donné à raison d'un bloc par ligne. Ce fichier contient (au plus) autant de lignes que de valeur différentes pouvant être prise par l'index d'un bloc (c'est-à-dire pour ce qui nous concerne 94 lignes). La ligne i correspond au ie bloc. Elle précise l'intervalle des fichiers appartenant au bloc. Les numéros des fichiers correspondent aux numéros de ligne dans le fichier $HOME/.stfs.filenames.
$HOME/.stfs.info
donne l'ensemble des informations associées à l'exécution de la commande stfsindex : date de création de l'index, nom de l'arborescence indexée, nombre de fichiers indexés, nombre de fichiers non-indexés de l'arborescence, taille moyenne des blocs, temps d'exécution de la commande stfsindex, prise en compte ou non des fichiers compressés/codés, etc.
$HOME/.stfs.log
est le fichier de log créé par l'option -l de la commande stfsindex.

  Syntaxe de la commande stfs

La commande stfs recherche les lignes des fichiers indexés par stfsindex contenant un mot qui corresponde à l'expression régulière pattern passée en paramètre. Le format d'affichage est équivalent à celui de grep : la ligne est précédée du nom fichier. La syntaxe de la commande est :
stfs    [options]    pattern

Les options de stfs sont un sous-ensemble des options de grep ; elles incluent au moins les options
-i
Ignore la distinction entre les majuscules et les minuscules lors des comparaisons.
-l
Affiche uniquement les noms des fichiers à raison d'une ligne par fichier. Si un pattern est trouvé plusieurs fois dans un fichier, le nom du fichier n'est affiché qu'une fois.
-c
N'affiche que le nombre de lignes qui correspondent au pattern.
-q
Quiet. Ne produit pas de résultat sur la sortie standard quelque soit le résultat de la recherche. La commande retourne une valeur nulle si et seulement si une ligne au moins correspond au pattern.
La commande stfs retourne
0
si une ou plusieurs occurrences du pattern ont été trouvées ;
1
si aucune occurrence n'a été trouvée ;
2
si les fichiers d'index n'ont pas été préalablement construits à l'aide de la commande stfsindex ;
3
en cas d'erreur d'accès aux fichiers de données (même si des occurrences du pattern ont été trouvées) ;

  Extensions

  Outils

La réalisation des commandes stfs et stfsindex nécessite la conversion d'un index de bloc en un caractère imprimable. Les commandes suivantes, écrites en C, sont données ; on trouvera les exécutables dans le répertoire  marquet/c-unix/stfs :
index2char
accepte en paramètre un index de bloc (valeur comprise entre 1 et 94) et affiche sur la sortie standard un caractère correspondant au codage de cet index.
char2index
accepte en paramètre un caractère et retourne un index de bloc ; valeur entière comprises entre 1 et 94.
Ces deux commandes retournent une valeur non nulle en cas d'erreur.

  Réalisation

La première chose à faire est de relire plusieurs fois en détail le présent sujet !

Vous devez rendre (sous une forme à définir avec votre enseignant de TD/TP) :
Ce document a été traduit de LATEX par HEVEA.