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

Langage Perl Discussion :

Chercher les dossiers contenant une extension donnée


Sujet :

Langage Perl

  1. #1
    Membre actif

    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2013
    Messages : 87
    Points : 217
    Points
    217
    Par défaut Chercher les dossiers contenant une extension donnée
    Bonjour tout le monde,

    Je voulais développer une fonction qui permettra:
    1- Parcourir l’arborescence d'un répertoire donné.
    2- Ne renseigner dans une liste ou un fichier txt que les dossiers contenant des fichiers ayant pour extension ".h".

    J'ai fait ce code qui sélectionne bien les dossiers contenant des *.h. Mais malheureusement je n'arrive pas à contrôler la recherche de telle sorte à ce qu'elle s’arrête une fois un seul fichier .h est rencontré!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
           find({  wanted   => sub { push @directories, $File::Find::dir if $_ =~ m/(\.h)\z/s },
                     nochdir  => 1,
                   }, $base);
    Voici ce que ça donne, SVP aviez vous une idée sur la condition que je peux mettre pour que le nom du répertoire soit retourné une fois un seul .h est trouvé?:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ..\..\lib\include
    ..\..\lib\include
    ..\..\lib\include
    ..\..\lib\include
    ..\..\lib\include
    ..\..\lib\api
    ..\..\lib\api
    ..\..\headers
     
    ..\..\headers
    Par avance Merci et bonne journée à tous!
    Nejma

  2. #2
    Membre actif

    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2013
    Messages : 87
    Points : 217
    Points
    217
    Par défaut
    Re Bonjour,

    J'ai trouvé une solution mais je n'en suis pas complètement persuadée...
    avec le code si dessus j'ai une première liste avec jute les dossiers contenant des *.h mais répéter le nombre de "fichiers *.h qu'il contiennent". J'ai donc pensé à prendre cette liste et supprimer les doublons.
    Cela marche bien mais je pense que c'est un peu lent, si j'arrive vraiment à interrompre la recherche une fois au moins un fichier .h est rencontré ce sera beaucoup plus rapide!
    si vous avez des idées je suis prenante. Merciii
    Ah pour la suppression des doublons j'utilise ça (au cas où il y'a des intéressés...):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        my %SaveKeys;
        foreach(@directories)
        { 
           my $key_ = File::Spec->canonpath($_); 
           $SaveKeys{$key_} = "path"; 
        }
        my @header = keys(%SaveKeys) ;
        foreach my $directory (@header) { print " $directory \n"; }
    Merci.

  3. #3
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Citation Envoyé par o_Nejma Voir le message

    J'ai fait ce code qui sélectionne bien les dossiers contenant des *.h. Mais malheureusement je n'arrive pas à contrôler la recherche de telle sorte à ce qu'elle s’arrête une fois un seul fichier .h est rencontré!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
           find({  wanted   => sub { push @directories, $File::Find::dir if $_ =~ m/(\.h)\z/s },
                     nochdir  => 1,
                   }, $base);
    Je ne pense pas que ce soit possible avec le module File::Find.

    Citation Envoyé par o_Nejma Voir le message

    Voici ce que ça donne, SVP aviez vous une idée sur la condition que je peux mettre pour que le nom du répertoire soit retourné une fois un seul .h est trouvé?:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ..\..\lib\include
    ..\..\lib\include
    ..\..\lib\include
    ..\..\lib\include
    ..\..\lib\include
    ..\..\lib\api
    ..\..\lib\api
    ..\..\headers
     
    ..\..\headers
    Il faut soit dédoublonner les résultats après coup (le plus simple est de les stocker comme clefs d'un hash, le dédoublonnage sera pour ainsi dire automatique), ou alors il faut implémenter la mécanique de File::Find soi-même manuellement. Je pencherais très largement pour la première solution (dédoublonnage).

  4. #4
    Membre actif

    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2013
    Messages : 87
    Points : 217
    Points
    217
    Par défaut
    Citation Envoyé par Lolo78 Voir le message
    Il faut soit dédoublonner les résultats après coup (le plus simple est de les stocker comme clefs d'un hash, le dédoublonnage sera pour ainsi dire automatique), ou alors il faut implémenter la mécanique de File::Find soi-même manuellement. Je pencherais très largement pour la première solution (dédoublonnage).
    Merci pour ta réponse Lolo78.
    En fait c'est ce que j'ai fait (sur mon deuxième message) mais vu le nombre de répertoire que j'ai et qui peuvent contenir jusqu'à des centaines de fichier header, la recherche prend un temps considérable! C'est pourquoi j'aimerai bien essayé une autre solution.

  5. #5
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    je ne suis pas sûr que ça te fasse vraiment gagner du temps, mais voici un programme faisant manuelle la recherche. Son seul avantage est s'arrêter de scanner un répertoire dès qu'il a trouvé au moins un *.h. Mais on ne peut pas empêcher que l'appel système renvoie toute la liste, c'est seulement en aval que l'on peut élaguer un peu les opérations.

    La fonction parcourt_dir parcourt récursivement l'arborescence à partie du répertoire de départ et ajoute les répertoires voulus à @directories.

    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
     
    use strict;
    use warnings;
     
    my $root_dir = shift; # répertoire de départ reçu en paramètre
    my @directories;
     
    parcourt_dir($root_dir);
     
    sub parcourt_dir {
        my $start_dir = shift;
        my @entries = glob("$start_dir/*.h");
        push @directories, $start_dir if @entries; # ajoute $start_dir du moment qu'il y a au moins un *.h
        my @sub_dirs = grep { -d } glob("$start_dir/*");
        parcourt_dir($_) for @sub_dirs; # appel récursif pour les sous-répertoires
    }
    print join "\n", @directories;

  6. #6
    Membre actif

    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2013
    Messages : 87
    Points : 217
    Points
    217
    Par défaut
    Merci beaucoup Lolo78, ça me semble intéressant je l'essayerai!
    Encore merci pour tes réponses!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 06/11/2010, 21h11
  2. comment retrouver les colonnes contenant une donnée precise
    Par monthaldo dans le forum Administration
    Réponses: 3
    Dernier message: 27/12/2007, 17h40
  3. Réponses: 9
    Dernier message: 08/11/2007, 13h33
  4. [Utilisation] Récupérer les modifications depuis une date donnée
    Par Sapience dans le forum CVS
    Réponses: 1
    Dernier message: 15/02/2006, 12h08
  5. Réponses: 2
    Dernier message: 18/10/2005, 08h05

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