Lire la commande
Sépare les options, les dossiers de départ et les critères.
Une version simplifiée de la commande Unix find, écrite en C pour
parcourir une arborescence et filtrer ses fichiers à partir d'expressions.
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.
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é.
Sépare les options, les dossiers de départ et les critères.
Crée les nœuds de test, d'action et les opérateurs AND ou OR.
Utilise opendir, readdir, stat et lstat.
Applique les critères à ses métadonnées et déclenche l'action demandée.
Affiche le chemin ou lance une commande externe avec fork et execvp.
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.
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.
Les options -P, -H et -L déterminent
si un lien reste une entrée ou si sa cible est suivie pendant le parcours.
-name, -type, -newer, -perm,
-user et -group interrogent le nom ou les métadonnées
obtenues avec l'API système.
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.
-print, -exec ... ; et -execdir ... ;
sont reliées à l'évaluateur. Les commandes externes sont lancées dans un
processus enfant puis attendues avec waitpid.
Les scripts construisent des arborescences temporaires et comparent les
sorties de MyFind à celles de la commande find installé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.
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.
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.
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 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.