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

Shell et commandes GNU Discussion :

Recherche à l'aide d'une fonction récursive


Sujet :

Shell et commandes GNU

  1. #21
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    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 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    en plus, mon astuce de comparer l'existence dans le tableau du répertoire immédiatement supérieur ne permet pas de retourner le résultat attendu, car bash explore les répertoires avant de montrer les fichiers.
    Entre nous, je n'ai absolument rien panné à ton programme. Déjà m'a fallu taper ls /etc/** chez-moi pour comprendre ce que voulait dire "**". Quand au reste...
    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]

  2. #22
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 238
    Points : 13 443
    Points
    13 443
    Par défaut
    Mais non; ne dis pas qu'il a raison; il a tort.

    Refabriquer une fonction de recherche n'est ni élégant, ni sensé. C'est du bricolage.

    Il est bien plus "généraliste" de dire "Je recherche puis je filtre et re-filtre jusqu'à avoir mon résultat " que de faire sa tambouille perso à chaque dossier .
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  3. #23
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 266
    Points : 12 681
    Points
    12 681
    Par défaut
    Bon ok, ma contribution personnelle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    rechercheRecursiveDossier ()
    {
        find "$1" -mindepth 1 -maxdepth 1 -path "$1/config" -printf "REP:%h\n" -quit -o -type d -exec echo {} \; | while read REP; do
            if [ "${REP/REP:/}" != "$REP" ]; then
                verifDossier "${REP/REP:/}" && echo "${REP/REP:/}";
            else
                rechercheRecursiveDossier "$REP";
            fi;
        done
    }
    Cordialement.

  4. #24
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    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 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    Mais non; ne dis pas qu'il a raison; il a tort.
    Attend, mais t'es qui toi ?

    Citation Envoyé par Flodelarab Voir le message
    Refabriquer une fonction de recherche n'est ni élégant, ni sensé. C'est du bricolage.
    Parce que tes deux find imbriqués c'est pas du bricolage peut-être ??? En tout cas mon script est quand-même plus élégant (et surtout plus évolutif) que ta ligne !!! Si tu crois que "programmer compact" est un gage de qualité...

    Citation Envoyé par Flodelarab Voir le message
    Il est bien plus "généraliste" de dire "Je recherche puis je filtre et re-filtre jusqu'à avoir mon résultat "
    Ouais ouais. Donc vaut mieux tout récupérer (quitte à avoir des milliers d'infos inutiles) puis éliminer ce qui ne va pas plutôt que ne récupérer que ce qui va...

    Citation Envoyé par Flodelarab Voir le message
    que de faire sa tambouille perso à chaque dossier .
    Manque de bol pour toi, la "tambouille" (et surtout son évolutivité) fait partie du cahier des charges !!!
    S'il avait juste voulu les fichiers config, à la rigueur ton truc peut passer, mais comme je te l'ai montré, le filtre du dossier aura besoin d'être complexifié. Comment tu feras s'il veut aussi que son dossier contienne un fichier "toto" fomaté comme /etc/passwd ??? Tu recodes tout ???

    Citation Envoyé par disedorgue Voir le message
    Bon ok, ma contribution personnelle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    rechercheRecursiveDossier ()
    {
        find "$1" -mindepth 1 -maxdepth 1 -path "$1/config" -printf "REP:%h\n" -quit -o -type d -exec echo {} \; | while read REP; do
            if [ "${REP/REP:/}" != "$REP" ]; then
                verifDossier "${REP/REP:/}" && echo "${REP/REP:/}";
            else
                rechercheRecursiveDossier "$REP";
            fi;
        done
    }
    Excellent (surtout l'utilisation du printf pour formater la réponse afin de mieux la tester). Mais malheureusement ne fonctionne pas (selon le besoin exprimé) si le dossier racine (ici "$1) possède un fichier "config". Certes le dossier apparait dans la liste des résultats mais le script explore aussi les sous-dossiers. Dur hein ce "cas particulier" du premier dossier exploré...
    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]

  5. #25
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 266
    Points : 12 681
    Points
    12 681
    Par défaut
    Chez moi, cela fonctionne correctement, l'exploration des sous dossiers m'étonne puisqu'il il y a un maxdepth et mindepth, il est sure, au pire, on scan tout le dossier juste pour trouver le config mais pas plus (enfin selon moi).
    Il y a le -quit qui force l'arret du find s'il le trouve...
    Cordialement.

  6. #26
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    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 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Chez moi, cela fonctionne correctement
    Peut-être que j'ai mal intégré ta fonction...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    moi@virtualux:~/aaa$ cat b.sh
    #!/bin/bash
     
    # Donc ici c'est ta fonction
    rechercheRecursiveDossier ()
    {
        find "$1" -mindepth 1 -maxdepth 1 -path "$1/config" -printf "REP:%h\n" -quit -o -type d -exec echo {} \; | while read REP; do
            if [ "${REP/REP:/}" != "$REP" ]; then
                verifDossier "${REP/REP:/}" && echo "${REP/REP:/}";
            else
                rechercheRecursiveDossier "$REP";
            fi;
        done
    }
     
    # Elle fait appel à "verifDossier" donc j'ai remis le mien... 
    verifDossier()
    {
    	test -f "$1/config"
    }
     
    # Et il faut bien l'appeler...
    rechercheRecursiveDossier $1 | while read rep
    do
    	echo "rep: $rep"
    done
    Voici mon arorescence test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    moi@virtualux:~/aaa$ tree -np a
    a
    |-- [drwxr-xr-x]  a/a
    |   `-- [-rw-r--r--]  a/a/config
    |-- [-rw-r--r--]  a/config
    |-- [drwxr-xr-x]  a/x
    |-- [drwxr-xr-x]  a/y
    |   `-- [-rw-r--r--]  a/y/config
    `-- [drwxr-xr-x]  a/z
        `-- [drwxr-xr-x]  a/z/a
            `-- [-rw-r--r--]  a/z/a/config
    Et son appel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    moi@virtualux:~/aaa$ ./b.sh a
    rep: a/a
    rep: a/y
    rep: a
    ...
    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. #27
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 266
    Points : 12 681
    Points
    12 681
    Par défaut
    Bon, j'ai pas le même problème que toi, sur ton arborescence, j'ai le souci avec les répertoires qui ont un nom qui commence avec un caractère inférieur au caractère c (pour config), enfin dans mon cas, ici cela dépend de comment le find parcours le répertoire...
    Le correctif serait celui-ci mais à part le fait que je n'utilise pas de boucle for pour le parcourt de fichier...:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    #!/bin/bash
     
    # Donc ici c'est ta fonction
    rechercheRecursiveDossier ()
    {
        ( [ -f "$1/config" ] && echo "REP:$1" || find "$1" -mindepth 1 -maxdepth 1 -type d -print ) | while read REP; do
            if [ "${REP/REP:/}" != "$REP" ]; then
                verifDossier "${REP/REP:/}" && echo "${REP/REP:/}";
            else
                rechercheRecursiveDossier "$REP";
            fi;
        done
    }
     
    # Elle fait appel à "verifDossier" donc j'ai remis le mien...
    verifDossier()
    {
            test -f "$1/config"
    }
     
    # Et il faut bien l'appeler...
    rechercheRecursiveDossier "$1" | while read rep
    do
            echo "rep: $rep"
    done
    J'aurai certainement pu faire un réarrangement pour utiliser directement la fonction verifDossier au lieu du test de présence de fichier...
    Sinon, un détail: ne pas oublier de protéger par des guillemets les variables pour ce protéger des nom de fichiers à la windows (avec des espaces).
    Cordialement.

  8. #28
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    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 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Bon, j'ai pas le même problème que toi, sur ton arborescence, j'ai le souci avec les répertoires qui ont un nom qui commence avec un caractère inférieur au caractère c (pour config), enfin dans mon cas, ici cela dépend de comment le find parcours le répertoire...
    C'est vrai que find renvoie les fichiers dans un ordre un peu abscons (l'ordre du readdir() probablement). C'est aussi pour ça que je passais par un ls. Mais bon, au pire tu rajoutes un sort à ton find...

    Citation Envoyé par disedorgue Voir le message
    Le correctif serait celui-ci mais à part le fait que je n'utilise pas de boucle for pour le parcourt de fichier...:
    Pareil, tu fais un while read. La différence se verra si un des fichiers contient un espace dans son nom...

    Citation Envoyé par disedorgue Voir le message
    J'aurai certainement pu faire un réarrangement pour utiliser directement la fonction verifDossier au lieu du test de présence de fichier...
    Moui. verifDossier à la place de ton test -f...
    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. #29
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 539
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 539
    Points : 19 361
    Points
    19 361
    Par défaut
    quel est l'intérêt de cette fonction pour/au lieu d' un simple test ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  10. #30
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    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 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Ben Phoenix89 l'a bien dit (http://www.developpez.net/forums/d14...e/#post7781378). Pour l'instant il cherche juste config mais ensuite les tests peuvent s'étoffer
    Citation Envoyé par Phoenix89 Voir le message
    En ce qui concerne la fonction verfiDossier, elle contiendra d'autre vérification : présence d'autres fichiers, bon formatage de certains d'entre eux, etc ...
    ...
    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]

  11. #31
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 266
    Points : 12 681
    Points
    12 681
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    C'est vrai que find renvoie les fichiers dans un ordre un peu abscons (l'ordre du readdir() probablement). C'est aussi pour ça que je passais par un ls. Mais bon, au pire tu rajoutes un sort à ton find...
    L'idée du sort avait été ma première idée, ce qui donnait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    rechercheRecursiveDossier ()
    {
        find "$1" -mindepth 1 -maxdepth 1 -path "$1/config" -printf "REP:%h\n" -quit -o -type d -printf "DEP:%p\n" | sort -r | while read REP; do
            if [ "${REP/REP:/}" != "$REP" ]; then
                verifDossier "${REP/REP:/}" && echo "${REP/REP:/}";
                break;
            else
                rechercheRecursiveDossier "${REP/DEP:/}";
            fi;
        done
    }
    Tout ça m'a permit de voir la limite du find et peut-être le manque d'un commutateur de base sur celui-ci qui permettrait comme par exemple ici, de rechercher des repertoires si tel fichier n'existe pas (en tout cas, j'ai pas trouvé comment faire ).
    Cordialement.

  12. #32
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 266
    Points : 12 681
    Points
    12 681
    Par défaut
    Comme j'avais 5 minutes, voici la dernière version "simplifiée" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    rechercheRecursiveDossier ()
    {
        find "$1" -mindepth 1 -maxdepth 1 $(verifDossier "$1" && echo -n "-printf REP:%h\\n -quit") -type d -print | while read REP; do
            [ "${REP/REP:/}" != "$REP" ] && echo "${REP/REP:/}" || rechercheRecursiveDossier "${REP}";
        done
    }
    Cordialement.

  13. #33
    Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2014
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Vous m'avez été d'une grande aide. Encore une fois merci à tous

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Aide pour une fonction récursive.
    Par fred61 dans le forum Débuter
    Réponses: 13
    Dernier message: 21/01/2015, 09h39
  2. Réponses: 3
    Dernier message: 30/05/2014, 23h04
  3. Recherche de l'aide pour une Fonction OptionButton
    Par Au2laDeNosReves dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 20/03/2009, 22h59
  4. Réponses: 2
    Dernier message: 17/06/2008, 13h08
  5. Besoin d'aide sur une fonction
    Par PrinceMaster77 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 30/08/2005, 18h40

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