IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

commande find implementée en C


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 27
    Points : 8
    Points
    8
    Par défaut commande find implementée en C
    Salut a tous,


    Voilà, on me demande, dans le cadre de mes études, d'implementer de manière simplifiée les commandes grep et find en C.

    Je suis au début :

    Le programme "Recherche" recherche les fichiers selon les critères spécifiés par les options et, éventuellement, effectue certaines opérations sur les fichiers trouvés.

    exemple d'option de recherche : Recherche -nom motif

    * -nom toto recherche les fichiers dont le nom est toto
    * -nom '*toto' recherche les fichiers dont le nom se termine par toto
    * -nom '*toto*' recherche les fichiers dont le nom contient toto
    * -nom 'toto*' recherche les fichiers dont le nom commence par toto


    J'ai donc besoin de déterminer le contenu de argv[].

    MAIS les options peuvent être mises dans le désordre et je suis OBLIGE d'avaoir quelque part l'option -c qui donne l'arborescence dans laquelle on doit rechercher le fichier (qui peut etre un répertoire, un lien ou un fichier)

    EXEMPLE: Recherche -c home/tata -nom '*titi*'

    ou

    Recherche -nom '*titi*' -c home/tata


    ET La recherche s'étend sur toute l'arborescence des fichiers à partir du chemin indiqué !!!!!
    -------------------------------------------------------------------------

    Voila je me demandais quelle méthode utiliser pour implémenter cela et aussi , comment manipuler les éléments de argv. J'ai pensé a un switch.

    Y'a t'il en C un possibilité de determiner si une chaine contenue dans argv commence, finit ou contient une chaine S ??


    Merci d'avance !!! =)

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2008
    Messages : 67
    Points : 42
    Points
    42
    Par défaut
    regarde du coté de la fonction "getopt" qui permet de récupérer des arguments en entrée (il y a même un exemple sur la page du man)

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 360
    Points : 23 599
    Points
    23 599
    Par défaut
    Bonjour,

    Citation Envoyé par 44Magnum Voir le message
    exemple d'option de recherche : Recherche -nom motif

    * -nom toto recherche les fichiers dont le nom est toto
    * -nom '*toto' recherche les fichiers dont le nom se termine par toto
    * -nom '*toto*' recherche les fichiers dont le nom contient toto
    * -nom 'toto*' recherche les fichiers dont le nom commence par toto
    En fait, les wildcards et autres artifices utilisés en Shell dans les noms de fichiers et autres sont appelés « globales ». Ils sont une sorte de langage régulier dégénéré et sont gérés par des fonctions POSIX : man glob.

    Si tu dois refaire grep, l'outil utilise par définition de vraies expressions régulières. Il y a là aussi de quoi les gérer (man regex) sans tout réinventer. Sinon, il faudra te pencher un peu sur les langages formels.

    Vois déjà si tes professeurs t'autorisent à utiliser ces facilités d'Unix.

    [J'ai donc besoin de déterminer le contenu de argv[].

    MAIS les options peuvent être mises dans le désordre et je suis OBLIGE d'avaoir quelque part l'option -c qui donne l'arborescence dans laquelle on doit rechercher le fichier (qui peut etre un répertoire, un lien ou un fichier)
    Dans le find original, il n'y a pas d'option « -c » mais cette information doit obligatoirement figurer en première position dans les arguments de la commande. Vérifie également si c'est ou non le comportement attendu de ton programme.

    Pour les arguments, tu peux utiliser getopt(). La man page contient un programme d'exemple.

    ET La recherche s'étend sur toute l'arborescence des fichiers à partir du chemin indiqué !!!!!
    La méthode habituelle pour cela est l'approche récursive : si le fichier que tu « trouves » est un sous-répertoire, alors tu ré-appelles ta fonction avec les mêmes paramètres, comme si c'était l'utilisateur qui l'avait lancé, mais en remplaçant le chemin de recherche précisé avec « -c » par celui du sous-répertoire en question.

    Y'a t'il en C un possibilité de determiner si une chaine contenue dans argv commence, finit ou contient une chaine S ??
    Oui : strstr().

  4. #4
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Petite subtilité : éviter de boucler indéfiniment si dans ton arborescence tu as un lien qui pointe (directement ou indirectement) plus haut dans l'arborescence.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 27
    Points : 8
    Points
    8
    Par défaut
    hey salut a tous, merci pour votre aide qui m'a été bien utile !



    J'ai une nouvelle question.

    Quand je parcours mon arborescence et que j'analyse chaque fichier present dans les differents repertoires (en utilisant recursivement readdir et stat, comment faire pour garder en memoire un fichier qui correspond a un de mes critères de recherche ?

    Je voudrais , une fois les fichiers trouvés, effectuer des action dessus (suppression par exemple !) mais jai besoin de pouvoir reacceder au fichier.


    Comment faire , A partir de son i noeud ? Son chemin ? Si oui comment recuperer ce chemin simplement ?


    Merci d'avance !! =)

  6. #6
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Tu peux ajouter le fichier à une liste chainée qui sera passée en paramètre de ta fonction récursive.

    L'inode n'est pas suffisant pour accéder à un fichier, puisqu'il faudrait aussi savoir sur quel device il se trouve. Le chemin du fichier est la bonne solution, mais je ne comprend pas ta question à ce sujet. Tu n'as pas besoin de "récupérer" le chemin du fichier, puisque tu le connais déjà. Si tu ne le connaissait pas, comment ferais-tu pour le stat()er ?

    Si ça te pose des problème, je suppose que c'est parce que tu fais un chdir() avant chaque appel de ta fonction récursive ? Si c'est le cas, tu peux récupérer le chemin courant avec getcwd().

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 27
    Points : 8
    Points
    8
    Par défaut
    Hey salut !

    Merci pour la reponse mais la j'ai abandonné cette idée, j'effectue directement les traitement sur les fichiers quand je les trouve !


    J'ai une toute autre question !


    Voila je suis supposé implémenter la recherche par nom (Recherche -nom 'toto' -c chemin par exemple)

    j'ai un souci :

    en plus de pouvoir rechercher un fichier qui a tel ou tel nom, mon programme doit aussi pouvoir faire la recherche des fichiers dont le nom commence ou finit par une chaine S !

    ex: Recherche -nom '*toto' --> les fic dont le nom se termine par toto !
    Recherche -nom 'toto*' --> les fic dont le nom commence par toto !
    Recherche -nom '*toto*' --> les fic dont le nom contient par toto ! (bon cela est facile avec strstr())

    Mais pour les deux premiers, je bloque, je ne trouve pas...


    Une idée peut être ?

    Merci d'avance ! =)




    On m'a repondu plus haut d'utiliser

  8. #8
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 360
    Points : 23 599
    Points
    23 599
    Par défaut
    Citation Envoyé par 44Magnum Voir le message
    Hey salut !

    Merci pour la reponse mais la j'ai abandonné cette idée, j'effectue directement les traitement sur les fichiers quand je les trouve !
    C'est une sage décision car c'est également ce que fais la commande find originale. Sinon, rien ne t'empêche de bufferiser la sortie de ton programme avec d'autres commandes, depuis le Shell.

    J'ai une toute autre question ! Voila je suis supposé
    « Censé ».

    … implémenter la recherche par nom (Recherche -nom 'toto' -c chemin par exemple) en plus de pouvoir rechercher un fichier qui a tel ou tel nom, mon programme doit aussi pouvoir faire la recherche des fichiers dont le nom commence ou finit par une chaine S !

    ex: Recherche -nom '*toto' --> les fic dont le nom se termine par toto !
    Recherche -nom 'toto*' --> les fic dont le nom commence par toto !
    Recherche -nom '*toto*' --> les fic dont le nom contient par toto ! (bon cela est facile avec strstr())

    Mais pour les deux premiers, je bloque, je ne trouve pas...
    Ben, ce n'est pas bien dur ! Si ta chaîne commence ou finit par « toto », c'est qu'elle contient « toto », et donc strstr() te renverra un résultat positif là-aussi. Et cette fonction te renvoit plus exactement la position de ta sous-chaîne dans ta chaîne. De là, je te laisse trouver tout seul, mais c'est vraiment élémentaire.

    Et si tu ne veux même pas utiliser strstr() (mais ce serait idiot de distinguer les différents cas alors que le travail est le même), il suffit de prendre le problème à l'envers et de regarder si le début de la chaîne, ou sa fin, est égal à « toto ». Il suffit d'utiliser strncmp() pour comparer deux chaînes sur un nombre maximum de caractères.

    Une idée peut être ? Merci d'avance ! =)
    On m'a repondu plus haut d'utiliser
    D'utiliser ?

    Oui, relis mon post #3. Tu y trouveras l'approche la plus orthodoxe.

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 27
    Points : 8
    Points
    8
    Par défaut
    "Et cette fonction te renvoit plus exactement la position de ta sous-chaîne"


    ?? Mais je ne comprend pas, je pensais qu'elle renvoyait un pointeur vers la sous chaine !

    Je ne comprend pas...

    Comment connaitre cette "position" ? Savoir si la chaibne commence avant un caractere donné ? Ou apres ?

    J'voudrais juste savoir ça apres je viendrai plus vous embeter sur ce forum ! lol


    Merci !=)

  10. #10
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 360
    Points : 23 599
    Points
    23 599
    Par défaut
    Citation Envoyé par 44Magnum Voir le message
    ?? Mais je ne comprend pas, je pensais qu'elle renvoyait un pointeur vers la sous chaine ! Je ne comprend pas... Comment connaitre cette "position" ? Savoir si la chaibne commence avant un caractere donné ? Ou apres ?
    Fais preuve d'imagination. :-)

    Tu te doutes bien qu'avoir un pointeur vers une chaîne dont on connaît déjà le contenu n'a pas beaucoup d'intérêt.

    Quel genre de valeur obtiens-tu si tu soustrais le pointeur renvoyé par strstr() à celui de la chaîne initiale ?

Discussions similaires

  1. commande find sous debian
    Par mirlidas dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 01/02/2007, 14h20
  2. Incompréhension avec la commande "find"
    Par Charly94 dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 28/12/2006, 19h17
  3. Option -prune avec la commande find
    Par gangsoleil dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 21/04/2006, 18h43
  4. La commande Find d'un recordset
    Par christel1982 dans le forum ASP
    Réponses: 22
    Dernier message: 14/11/2005, 21h36
  5. La commande find
    Par Invité4 dans le forum Shell et commandes GNU
    Réponses: 9
    Dernier message: 22/03/2005, 15h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo