Le but du projet est d'écrire un programme qui
implémente une partie (très simplifiée) des fonctionnalités des commandes
find
et grep
. Votre programme recherche les fichiers
selon les critères spécifiés par les options et, éventuellement, effectue
certaines opérations sur les fichiers trouvés.
L'appel
recherche
options
lance votre programme, la recherche s'effectue à partir des répertoires
donnés avec l'option -c
(voir la description détaillée
ci-dessous) . La recherche s'étend sur toute l'arborescence des fichiers à
partir du chemin indiqué.
Il y a deux types d'options. Les options de recherche donnent les critères de recherche, les options d'actions indiquent l'opération à effectuer sur le fichier sélectionné (le fichier qui satisfait les critères de recherche).
Dans la suite le terme fichier signifie n'importe quel
type de fichier : un fichier régulier, un répertoire ou un lien symbolique
(on ignore l'existence de fichiers spéciaux). Le terme nom de fichier
signifie toujours le nom de base, par exemple dans
/usr/dupont/Enseignement/examen.txt
le nom de fichier est
examen.txt
.
-c chemin |
On effectue la recherche à partir de chemin. Au
moins une option -c doit être spécifiée. Plusieurs
options -c sont possibles si nous voulons faire la
recherche dans plusieurs répertoires. |
-nom motif |
vrai si le nom de fichier contient le motif. Le motif est une
chaîne de caractères, mais le caractère * au début ou à la fin du
motif signifie "n'importe quelle suite de caractères".Exemples
:
|
|
vrai uniquement si le fichier est de type t où
t est un des types suivants :
|
|
vrai si propriétaire est le propriétaire du fichier. La
structure struct stat utilisée avec les fonctions
lstat() et stat() contient un champ pour
l'identifiant du propriétaire (type entier uid_t ) et le
propriétaire peut être spécifié par ce numéro. Exemple :
recherche -u 1000 cherche les fichiers dont
l'identifiant du propriétaire est 1000.
Optionnel: On pourra faire aussi |
|
vrai si le fichier régulier contient la chaîne de caractères
motif. Exemple : recherche -texte '
toto' -c /home/dupont cherche les fichiers réguliers qui
contiennent le caractère espace suivie de "toto". |
|
vrai si le fichier régulier est vide (de longueur 0) ou le répertoire est vide |
|
par défaut on écrira sur la sortie standard les chemins complets
vers les fichiers sélectionnés. -noprint indique de
supprimer cette sortie. |
-d droits |
vrai si nous avons les droits spécifiés pour le fichier. Par
exemple
trouve les fichiers pour lesquels nous avons les droits de lecture
et exécution. Pour vérifier si nous avons les droits demandés le
programme utilisera la fonction |
S'il y a plusieurs options de recherche alors le fichier sera sélectionné
s'il satisfait tous les critères de recherche. Exemple :
recherche -droits x -type f -c /home/toto
cherchera les fichiers
réguliers pour lesquels nous avons le droit d'exécution, la recherche
s'effectue à partir du répertoire /home/toto
|
supprimer les fichiers sélectionnés. Cela concerne aussi bien les
fichiers réguliers (ou plus exactement les liens et les liens
symboliques) à supprimer avec unlink() , que
les répertoires, à supprimer avec rmdir() |
-a |
La même chose que l'option précédente mais si le fichier à supprimer est un répertoire qui n'est pas vide alors on essaie aussi de supprimer récursivement tous les sous-répertoires et fichiers qu'il contient. |
|
Cette option, si elle est utilisée, est toujours la dernière. Les
paramètres sont tous les paramètres de
recherche qui suivent -e. Si cette option est
spécifiée et si le fichier trouvé est un fichier pour lequel on a le
droit d'exécution (encore access() à utiliser) alors
on exécutera le programme trouvé avec les paramètres.
Exemple :
recherche dans le répertoire
|
La recherche s'effectue toujours non seulement sur tous les répertoires
donnés par -c
mais aussi sur tous les sous-répertoires,
sous-sous-répertoires etc.
Au lieu de faire des fonctions récursives on demande de créer des nouveaux processus à chaque fois qu'il y a un nouveau sous-répertoire à parcourir.
Par exemple si on fait
recherche -c . autres_options
et si le répertoire courant . contient un fichier régulier aaa
et deux sous-répertoires bbb
et ccc
alors on
vérifie si aaa bbb ccc
satisfont les critères de recherche, et si
c'est la cas on applique les actions et on lance deux nouveaux processus
qui doivent faire la même chose pour les répertoires bbb ccc
(qui à leur tour peuvent lancer d'autres processus).
*.c
et *.h
) et un
Makefile.
Makefile
doit permettre la compilation avec
make
, make clean
devrait supprimer tous les
fichiers *.o
et l'exécutable.alire.txt
doit donner les noms des auteurs et
vous pouvez y mettre toute remarque à l'attention du jury de
soutenances.xxx_yyy.tar.gz
xxx_yyy
contenant votre projet. Le mail
avec le projet est à envoyer aux chargés de TD (pour votre groupe) et au
chargé de cours avec comme sujet : projet systemes
.