S5 · 2024 1 semaine

MyFind

Une version simplifiée de la commande Unix find, écrite en C pour parcourir une arborescence et filtrer ses fichiers à partir d'expressions.

C99 API POSIX AST Make Tests différentiels

Le projet en quelques mots

MyFind reproduit ce principe sans utiliser les fonctions de parcours toutes faites interdites par le sujet. Le programme ouvre lui-même les répertoires, lit les métadonnées de chaque entrée puis évalue l'expression donnée en ligne de commande.

Le rendu conservé contient le programme C, son Makefile et cinq scripts de tests. Il couvre le parcours, plusieurs tests, deux opérateurs booléens et l'exécution de commandes externes, avec un périmètre plus réduit que GNU find.

Du terminal au résultat

Le traitement sépare les options de parcours, les points de départ et l'expression. Cette dernière est représentée par un arbre avant d'être évaluée sur chaque fichier rencontré.

01

Lire la commande

Sépare les options, les dossiers de départ et les critères.

02

Construire l'expression

Crée les nœuds de test, d'action et les opérateurs AND ou OR.

03

Parcourir les dossiers

Utilise opendir, readdir, stat et lstat.

04

Évaluer chaque entrée

Applique les critères à ses métadonnées et déclenche l'action demandée.

05

Produire le résultat

Affiche le chemin ou lance une commande externe avec fork et execvp.

Structure de l'AST

Chaque nœud est un test, une action ou un opérateur. Les opérateurs conservent deux enfants, tandis que les feuilles portent le critère et son argument éventuel.

Ce qui est présent dans le rendu

Parcours récursif

Zéro ou plusieurs points de départ sont acceptés. Sans chemin, la recherche commence dans le dossier courant. L'option -d permet de traiter un répertoire après son contenu.

Liens symboliques

Les options -P, -H et -L déterminent si un lien reste une entrée ou si sa cible est suivie pendant le parcours.

Tests sur les fichiers

-name, -type, -newer, -perm, -user et -group interrogent le nom ou les métadonnées obtenues avec l'API système.

Expressions

L'arbre prend en charge la conjonction implicite ou -a et l'alternative -o. Leur comportement simple est présent, mais les combinaisons imbriquées ne sont pas entièrement conformes à find.

Actions

-print, -exec ... ; et -execdir ... ; sont reliées à l'évaluateur. Les commandes externes sont lancées dans un processus enfant puis attendues avec waitpid.

Tests différentiels

Les scripts construisent des arborescences temporaires et comparent les sorties de MyFind à celles de la commande find installée.

Vérification du rendu conservé

C99

Compilation contrôlée

Le Makefile demande -Wall, -Wextra, -Werror, -Wvla et -pedantic. Avec l'environnement actuel, la compilation stricte s'arrête sur une redéfinition de macro POSIX ; le binaire de vérification compile sans traiter cet avertissement comme une erreur.

16 / 18

Comparaisons de base

Après normalisation des fins de ligne du script archivé, seize comparaisons de sorties sur dix-huit correspondent à find. Les deux écarts concernent une conjonction et une expression groupée.

Périmètre restant

La négation, les parenthèses et -delete ne sont pas implémentés dans cette copie. Le parseur reconnaît la forme -exec ... +, mais l'accumulation des chemins n'est pas finalisée. La détection des cycles de liens symboliques n'apparaît pas non plus dans le parcours.

Synthèse du projet

Travail réalisé

Le rendu assemble un parseur de ligne de commande, une représentation en arbre, un parcours récursif et des actions système. Il relie les critères à stat, fnmatch, aux bases utilisateurs et aux processus Unix.

Ce que le projet m'a apporté

Ce projet m'a permis de manipuler directement les métadonnées et les répertoires Unix, de structurer des expressions sous forme d'arbre et de confronter un programme C à un outil de référence par des tests différentiels.