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

Modules Perl Discussion :

[File::Find::Rule] Problème désactivation récursivité


Sujet :

Modules Perl

  1. #1
    Membre habitué
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Mars 2015
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2015
    Messages : 138
    Points : 138
    Points
    138
    Par défaut [File::Find::Rule] Problème désactivation récursivité
    Bonjour,

    en entrée, le contenu du répertoire /log est :
    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
    dpi@uvmlsrv01 /log $ find .
    .
    ./lost+found
    find: `./lost+found': Permission denied
    ./controle
    ./controle/skel_uvmlsrv01.log
    ./tech
    ./tech/skel5-fnctl.pl_10829_20160803_154154.log
    ./tech/skel5-fnctl_10725_20160803_151229.log
    ./tech/skel5-fnctl_10732_20160803_151345.log
    ./tech/skel5-fnctl.pl_11021_20160803_164413.log
    ./tech/skel5-fnctl.pl_11063_20160803_165831.log
    ./tech/skel5-fnctl_10790_20160803_153108.log
    ./tech/skel5-fnctl.pl_10862_20160803_155524.log
    ./tech/skel5-fnctl.pl_11049_20160803_165235.log
    ./tech/dir1
    ./tech/dir1/dir11
    ./tech/dir1/dir11/dir111
    ./tech/dir1/dir11/dir111/testpto.txt
    ./tech/skel5-fnctl_10695_20160803_150344.log
    ./tech/skel5-fnctl.pl_10822_20160803_154101.log
    ./tech/skel5-fnctl.pl_10929_20160803_160713.log
    ./tech/skel5-fnctl.pl_11070_20160803_165903.log
    ./tech/skel5-fnctl_10773_20160803_152717.log
    ./testpto2.txt
    ./testpto3.txt
    Je souhaite au final lister les fichiers testpto* du répertoire de départ, cad /log, sans descendre dans les sous-répertoire.

    Dans un premier temps, je descends dans les sous-répertoires avec le code suivant :
    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
    #!/usr/bin/env perl
    use strict;
    use warnings;
    use File::Find::Rule;
    use feature 'say';
     
    my $dir     = shift;
    my $pattern = 'testpto*';
     
    my $lf_out = File::Find::Rule->directory
                    ->name('lost+found')
                    ->prune
                    ->discard;
     
    my $file_in = File::Find::Rule->file
                    ->name($pattern);
     
    my @files = File::Find::Rule->or  ( $lf_out, $file_in )
                                ->in  ( $dir );
     
    foreach my $f (@files) {
        say $f;
    }
    sortie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     ./test_file_find_rule.pl /log
    /log/testpto3.txt
    /log/testpto2.txt
    /log/tech/dir1/dir11/dir111/testpto.txt
    Maintenant, le problème survient lorsque je ne veux pas descendre dans les sous-répertoires. Mon interprétation est que la règle $recur_out est vraie si maxdepth est supérieur à 1 et est écartée avec le not :
    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
    27
    28
     
    #!/usr/bin/env perl
    use strict;
    use warnings;
    use File::Find::Rule;
    use feature 'say';
     
    my $dir     = shift;
    my $pattern = 'testpto*';
     
    my $lf_out = File::Find::Rule->directory
                    ->name('lost+found')
                    ->prune
                    ->discard;
     
    my $recur_out = File::Find::Rule->directory
                    ->maxdepth( '>1' );
     
    my $file_in = File::Find::Rule->file
                    ->name($pattern);
     
    my @files = File::Find::Rule->or  ( $lf_out, $file_in )
                                ->not ( $recur_out )
                                ->in  ( $dir );
     
    foreach my $f (@files) {
        say $f;
    }
    sortie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ./test_file_find_rule.pl /log
    /log/testpto3.txt
    /log/testpto2.txt
    /log/tech/dir1/dir11/dir111/testpto.txt

  2. #2
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 392
    Points : 2 044
    Points
    2 044
    Par défaut
    Bonjour,
    Il me semble qu'il y a un exemple qui devrait convenir.
    Perso je l'utilise pour faire des recherches à l'aide de regex... Avec et sans récursivité... ça fonctionne à merveille !

  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 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    si tu cherches juste a lister les fichiers d'un répertoire dans descendre récursivement dans les sous répertoires, alors il est probablement peu utile d'utiliser un module comme File::Find::Rule.

    Un simple usage de la fonction glob peut suffire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    my @fichiers = glob ("/log/testpto*");

  4. #4
    Membre habitué
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Mars 2015
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2015
    Messages : 138
    Points : 138
    Points
    138
    Par défaut
    Bonsoir,

    certains répertoires doivent être explorés de manière récursive, d'autres non. Je cherche à gérer cela de manière globale avec ce module.
    Il semblerait que maxdepth puisse répondre à cette demande, mais je n'y arrive pas.

  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 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    D'après ce que je lis dans la doc, essaie peut-être avec maxdepth à 0.

  6. #6
    Membre habitué
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Mars 2015
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2015
    Messages : 138
    Points : 138
    Points
    138
    Par défaut
    Déjà essayé :/

  7. #7
    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 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Je ne peux pas tester là sur ma tablette.

    Je te conseillerais de tester avec un cas plus simple, ne comportant qu'un seul appel à File::Find::Rule, afin de bien comprendre dans quels cas il descend dans une recherche récursive et dans quels cas il ne le fait pas. Tu pourras alors revenir à ta construction de règles un peu plus compliquée.

  8. #8
    Membre habitué
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Mars 2015
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2015
    Messages : 138
    Points : 138
    Points
    138
    Par défaut
    Citation Envoyé par Lolo78 Voir le message
    Je te conseillerais de tester avec un cas plus simple, ne comportant qu'un seul appel à File::Find::Rule, afin de bien comprendre dans quels cas il descend dans une recherche récursive et dans quels cas il ne le fait pas. Tu pourras alors revenir à ta construction de règles un peu plus compliquée.
    Ton message avisé a été un déclic. Je suis parti d'un cas simple, lister tous les fichiers, ensuite implémenter maxdepth, filtrer sur le motif, exclure 'lost+found', etc.

    Un grand MERCI

    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
    #!/usr/bin/env perl
    use strict;
    use warnings;
    use File::Find::Rule;
    use feature 'say';
     
    my $dir     = shift;
    my $level   = shift,
    my $pattern = shift;
     
    my $rule = File::Find::Rule->new;
    $rule->or($rule->new
                   ->directory
                   ->name(qr/lost\+found|controle/)
                   ->prune
                   ->discard,
              $rule->new);
    $rule->file;
    $rule->maxdepth($level);
    $rule->name($pattern);
     
    my @files = $rule->in( $dir );
     
    foreach my $f (@files) {
        say $f;
    }
    sorties :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     ./test_file_find_rule.pl /log 1 'testpto*'
    /log/testpto3.txt
    /log/testpto2.txt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ./test_file_find_rule.pl /log 8 'testpto*'
    /log/testpto3.txt
    /log/testpto2.txt
    /log/tech/testptoxxx.txt
    /log/tech/dir1/testptoyyy.txt
    /log/tech/dir1/dir11/dir111/testpto.txt

Discussions similaires

  1. Problème d'utilisation de File::Find
    Par jotape75 dans le forum Modules
    Réponses: 2
    Dernier message: 05/06/2007, 10h51
  2. Problème de récursivité
    Par mehdi.berra dans le forum C
    Réponses: 8
    Dernier message: 14/12/2006, 18h42
  3. [hyper file client/serveur] problème de droit
    Par routmout dans le forum HyperFileSQL
    Réponses: 3
    Dernier message: 17/06/2006, 22h48
  4. Problème de récursivité
    Par tazmania dans le forum C
    Réponses: 24
    Dernier message: 14/12/2005, 15h34
  5. Probleme de perf avec File::Find::name;
    Par Ludo167 dans le forum Modules
    Réponses: 6
    Dernier message: 14/07/2004, 12h31

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