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 :

Ecriture d'un shell : gestion des motifs (caractère joker)


Sujet :

C

  1. #1
    agh
    agh est déconnecté
    Membre du Club
    Inscrit en
    Juillet 2002
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 51
    Points : 49
    Points
    49
    Par défaut Ecriture d'un shell : gestion des motifs (caractère joker)
    Bonjour à tous,

    Je dois pour l'école écrire un "petit shell" sous Linux.
    Tout ce que j'ai fait marche jusqu'à présent, y'a pas de soucis.

    Là où je commence à bloquer, c'est sur la gestion des motifs (du caractère joker '*').

    Par exemple, si je fais :

    Il va me répondre que le fichier '*.c' n'existe pas.
    normal...

    Ma question est donc assez simple : comment pourrais-je gérer ça ?
    J'avoue n'avoir pas trop d'idées...

    je vous remercie beaucoup.
    Alexis
    ----------
    Delphi 7 Perso [FR]
    Windows XP Pro [FR]

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 42
    Points : 52
    Points
    52
    Par défaut
    fais ls *c
    a+;

  3. #3
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,
    Citation Envoyé par agh Voir le message
    Ma question est donc assez simple : comment pourrais-je gérer ça ?
    J'avoue n'avoir pas trop d'idées...
    Pour ça, je dirai qu'il faut que ton shell est une notion de de qu'il a en face de lui : fichiers, répertoires...

    Posix -puisse que tu es sous linux- contient ce qu'il te faut : opendir, readdir... le tout est rangé dans dirent.h.

    http://www.opengroup.org/onlinepubs/...h/readdir.html

  4. #4
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    L'autre solution est d'inclure un moteur d'expressions régulières dans ton shell, de façon à ce qu'il puisse vérifier la concordance d'un paramètre "nom de fichier" (avec jokers éventuels) et le nom réel d'un fichier/répertoire sur le filesystem...
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  5. #5
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Ca tombre bien que tu sois sous Linux, voici un tutoriel assez sympa pour débuter dans la programmation d'un interpréteur de commandes: http://ftp.traduc.org/doc-vf/gazette...1/lg111-G.html
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 699
    Points : 30 999
    Points
    30 999
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par agh Voir le message
    Ma question est donc assez simple : comment pourrais-je gérer ça ?
    J'avoue n'avoir pas trop d'idées...
    Faut utiliser les regex. T'as un tas de routines qui pourront t'indiquer si une chaine classique "abc" matche une expression joker.
    Donc pour ton "ls *.c", tu balayes l'ensemble des fichiers du répertoire et tu regardes si le nom balayé matche le nom demandé.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    pourquoi faire compliqué ??

    par exemple dans le cas de "ls *.c"

    commande = ls
    paamètre = *.c

    extension => indiquée par le point
    * = tous les fichiers

    opendir
    readdir
    d->name
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 699
    Points : 30 999
    Points
    30 999
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    pourquoi faire compliqué ??

    par exemple dans le cas de "ls *.c"

    commande = ls
    paamètre = *.c

    extension => indiquée par le point
    * = tous les fichiers
    Ouaip, dans ce cas là ok. Mais s'il veut un shell qui sache reconnaitre "[aeiou]*x*[0-9]*.c", ce sera une autre paire de manches...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Ou même simplement un truc du genre "ls file*num???.*", commande acceptée par n'importe quel shell sur n'importe quelle machine (DOS, Windows, Unix, ...).
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  10. #10
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 378
    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 378
    Points : 23 670
    Points
    23 670
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Ouaip, dans ce cas là ok. Mais s'il veut un shell qui sache reconnaitre "[aeiou]*x*[0-9]*.c", ce sera une autre paire de manches...
    Ou même encore, les expressions contenant des slashes, telles que :

    $ ls -l /proc/*/fd/*

  11. #11
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Ou même encore, les expressions contenant des slashes, telles que :

    $ ls -l /proc/*/fd/*
    pour ce genre de truc, utiliser un regex ne solutionnera pas beaucoup plus ..

    Il te faudra de toutes façons une espèce d'analyseur syntaxique pour stocker les numéros hiérarchiques de sous-répertoires...



    Citation Envoyé par Sve@r Voir le message
    Ouaip, dans ce cas là ok. Mais s'il veut un shell qui sache reconnaitre "[aeiou]*x*[0-9]*.c", ce sera une autre paire de manches...
    Citation Envoyé par Mac LAK Voir le message
    Ou même simplement un truc du genre "ls file*num???.*", commande acceptée par n'importe quel shell sur n'importe quelle machine (DOS, Windows, Unix, ...).

    Ce que je veux dire, c'est qu'à mon avis il est mieux pour l'esprit et l'éducation, pédagogiquement, d'utiliser sa tête et de sortir un algo réel, même faiblement performant mais correct algorithmiquement, et, ensuite, dans une phase d'optimisation, d'utiliser un outil qui remplace une partie d'opération de manière plus efficace..


    Là ce que je vois poindre (et beaucoup de posts ici ou sur le forum algo en sont les témoins) est une incopréhension globale du problème, une impossibilité à formuler correctement le problème ou sa solution, l'utilisation d'outils devenant pré-établi par rapport à la compréhesnion de ce que ça fait réellement...

    Combien de posts vois-je sur le forum Algo ou des gens disent "Comment utiliser cette commande MatLab ?" et, quand on leur pose une question "j'y connais rien en maths, j'en suis resté aux maths du lycée et encore".....


    Je pense que ce n'est ni leur rendre servce, ni nous (en tant que société) nous rendre service...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  12. #12
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 378
    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 378
    Points : 23 670
    Points
    23 670
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    pour ce genre de truc, utiliser un regex ne solutionnera pas beaucoup plus ..

    Il te faudra de toutes façons une espèce d'analyseur syntaxique pour stocker les numéros hiérarchiques de sous-répertoires...
    D'un point de vue purement formel, non : Tu peux énumérer la totalité des chemins (avec find, par exemple) et les confronter chacun à une expression régulière similaire à cette expression, cela fonctionnera aussi bien qu'en se restreignant aux seuls fichiers d'un répertoire donné.

    En revanche, au point de vue des performances, procéder ainsi n'est pas terrible ! Je pense que le mieux est d'écrire un analyseur qui fait le bilan de tous les chemins ou noms qui valident l'expression jusqu'au premier joker puis, de là, rechercher tous ceux qui valident le ou les jokers plus le caractère suivant s'il existe, et itérer ainsi, en tenant compte du fait que l'étoile ne traverse pas les répertoires d'elle-même.

  13. #13
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    Je pense que ce n'est ni leur rendre servce, ni nous (en tant que société) nous rendre service...
    Je suis d'accord avec toi sur le fond, mais cela dépend aussi du demandeur.

    Le gars qui VEUT apprendre va s'implémenter son propre système de regexp pour faire la fonction, en s'inspirant du fait qu'on l'aiguille vers ce principe de solution. OK, il ne sera pas forcément hyper puissant, mais au moins, il aura compris le principe.
    Le "feignant" va chercher un module tout fait et tenter (vainement ?) de comprendre comment l'intégrer à son programme.

    Le premier aura compris comment cela fonctionne, et verra au fur et à mesure de son avancée des conditions nécessaires comme, justement, le maintien d'une table de matches.
    Le second fera du chamanisme et se gaufrera presque à coup sûr.


    C'est "cruel", si l'on veut, mais pour ma part je pars du principe que l'on n'a que le premier cas de figure sur le forum : des gens qui veulent apprendre, et non pas des gens qui veulent qu'on "fasse leurs devoirs".

    Tu noteras que personne n'a cité de librairie de regexp par exemple, ce que l'on aurait fait si quelqu'un avait posé la question sous la forme "Quelqu'un connaitrait une solution fiable pour ajouter une gestion des caractères génériques dans les noms de fichiers pour une application existante ?"...
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  14. #14
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 699
    Points : 30 999
    Points
    30 999
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    Ce que je veux dire, c'est qu'à mon avis il est mieux pour l'esprit et l'éducation, pédagogiquement, d'utiliser sa tête et de sortir un algo réel, même faiblement performant mais correct algorithmiquement, et, ensuite, dans une phase d'optimisation, d'utiliser un outil qui remplace une partie d'opération de manière plus efficace..
    Ok, j'ai compris ton point de vue. Mais tu conviendras que c'est discutable. En effet, il y a des arguments qui militent pour la création de l'algo personnel (façonner son esprit, apprendre, etc) et d'autres pour la réutilisation d'objets touts faits (ne pas réinventer la roue, etc) et comme l'ensemble des arguments qui peuvent faire pencher vers l'un ou l'autre avis sont tous valables, la discussion ne pourra jamais être définitivement tranchée.

    Perso je pense que celui qui apprend doit apprendre à créer certains outils (peut-être pas tous car il y en a des tas) puis ensuite, une fois qu'il a acquis certaines connaissances, peut ensuite s'en passer et réutiliser ceux qui existent. Toutefois, façonner un compilo de regex c'est pas évident (surtout que l'original a été créé par lex/yacc)...

    Citation Envoyé par souviron34 Voir le message
    Je pense que ce n'est ni leur rendre servce, ni nous (en tant que société) nous rendre service...
    Arf, peut-être un poil exagéré. Dans l'absolu de l'extrémisme, c'est très certainement vrai mais pour cet exo...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. créer un shell : gestion des chemins
    Par boboss123 dans le forum C
    Réponses: 0
    Dernier message: 29/03/2011, 10h19
  2. Réponses: 1
    Dernier message: 17/10/2006, 04h39
  3. Gestion des caractères spéciaux
    Par claralavraie dans le forum Oracle
    Réponses: 1
    Dernier message: 22/06/2006, 14h41
  4. [VBS]Gestion des chaînes de caractères
    Par Edoxituz dans le forum VBScript
    Réponses: 11
    Dernier message: 29/01/2006, 17h07
  5. Gestion des chaînes de caractères
    Par Furius dans le forum VBScript
    Réponses: 5
    Dernier message: 06/01/2006, 15h01

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