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 :

Perl - Compter le nombre de sous dossier


Sujet :

Langage Perl

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 23
    Points : 9
    Points
    9
    Par défaut Perl - Compter le nombre de sous dossier
    Bonjour!
    Après quelques recherches et du codage je suis arrivée a compter les sous dossiers que contient un dossier. J'aimerais réussir à compter TOUS les sous dossiers contenus dans un répertoire.
    Exemple :

    Dossier 1
    -SS Dossier 1
    -SS Dossier 2
    -ss ss Dossier 1
    -ss ss Dossier 2


    A l'heure actuelle il me compte que 2 dossiers dans Dossier 1 alors que je voudrais qu'il m'en compte 4 . Mais je bloque...

    Voilà mon bout de code :

    #!/usr/bin/perl
    use strict;use warnings;

    my ($nbrep, $nbfic, $fichier, $dossier) = (0, 0, undef, 'd:\dossier1');
    opendir (my $dir, $dossier) or die "$dossier n'existe pas !";
    my @files = readdir $dir;
    foreach $fichier (@files)
    {
    $nbrep++ if (-d "$dossier/$fichier");
    }
    closedir $dir;
    print "Il y a $nbrep répertoire(s) dans $dossier.\n";


    Si quelqu'un peut m'aider..

    Merci

  2. #2
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Tu dois écrire un programme récursif. Voici un sous-programme que quelqu'un m'avait donné sur ce forum, qui retourne la liste des sous-répertoires. Cela devrait pouvoir t'aider, essaie de l'adapter :
    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
    29
    # But         : lister repertoires et sous repertoires.
    # Retourne  : tableau de repertoires
    # Necessite : rien
     
    sub lister_repertoires_recursif {
      unless( scalar(@_) == 1) {
        my $usage = <<'FIN_USAGE';
        Usage: lister_repertoires_recursif($repertoire);
    FIN_USAGE
        croak($usage);
       }
     
      my ($repertoire) = @_;
        opendir (REP, $repertoire) or
          die $_;
        my @file_rep = grep { !/^\.\.?$/ } readdir(REP);
        closedir (REP);
        my @repertoires = ();
        foreach my $nom (@file_rep) {
     
            if ( -d "$repertoire/$nom") {
              push (@repertoires, "$repertoire/$nom");
              push (@repertoires, &lister_repertoires_recursif("$repertoire/$nom"));
            }
        }
        return @repertoires;
    }
     
    my @repertoires = lister_repertoires_recursif('chemin dossier');

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 23
    Points : 9
    Points
    9
    Par défaut
    Merci pour cette réponse
    Mais lorsque je teste ton bout de code j'ai une erreur. Je voulais te demander si il suffisait de remplacer la derniere ligne par le chemin que l'on souhaite :

    my @repertoires = lister_repertoires_recursif('c:\Perl');

    Apres plusieurs test rien a faire ça ne veut pas marcher :s

    Merci pour ton aide!!


    Voici le code comme je l'ai mis :


    #!/usr/bin/perl
    # But : lister repertoires et sous repertoires.
    # Retourne : tableau de repertoires
    # Necessite : rien

    sub lister_repertoires_recursif {
    unless( scalar(@_) == 1) {
    my $usage = <<'FIN_USAGE';
    Usage: lister_repertoires_recursif($repertoire);
    FIN_USAGE
    croak($usage);
    }

    my ($repertoire) = @_;
    opendir (REP, $repertoire) or
    die $_;
    my @file_rep = grep { !/^\.\.?$/ } readdir(REP);
    closedir (REP);
    my @repertoires = ();
    foreach my $nom (@file_rep) {

    if ( -d "$repertoire/$nom") {
    push (@repertoires, "$repertoire/$nom");
    push (@repertoires, &lister_repertoires_recursif("$repertoire/$nom"));
    }
    }
    return @repertoires;
    }

    my @repertoires = lister_repertoires_recursif('c:\Perl');

  4. #4
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Utilise les balises CODE, cela sera plus lisible. Chez moi, cela fonctionne très bien. Essaie avec un répertoire plus petit et ajoute les pragmas strict et warnings.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 23
    Points : 9
    Points
    9
    Par défaut
    J'ai rajouter Strict & Warnings

    Après réflexion est ce que le fait que sous windows ça soit des anti-slash pour le chemin ça peut poser problèmes? Car là on fait : $repertoire/$nom


    J'ai toujours une erreur : No output available

    EDIT : Voilà en changer les "\" par des "/" ça marche

    Merci beaucoup!

    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
    29
    30
    31
    32
    33
    34
    #!/usr/bin/perl
    # But : lister repertoires et sous repertoires.
    # Retourne : tableau de repertoires
    # Necessite : rien
    use strict;use warnings;
     
    sub lister_repertoires_recursif {
    unless( scalar(@_) == 1) {
    my $usage = <<'FIN_USAGE';
    Usage: lister_repertoires_recursif($repertoire);
    FIN_USAGE
    croak($usage);
    }
     
    my ($repertoire) = @_;
    opendir (REP, $repertoire) or
    die $_;
    my @file_rep = grep { !/^\.\.?$/ } readdir(REP);
    closedir (REP);
    my @repertoires = ();
    foreach my $nom (@file_rep) {
     
    if ( -d "$repertoire/$nom") {
    push (@repertoires, "$repertoire/$nom");
    push (@repertoires, &lister_repertoires_recursif("$repertoire/$nom"));
    }
    }
    return @repertoires;
    }
     
    my @repertoires = lister_repertoires_recursif('c:/Perl');
    my $tableau = @repertoires;
     
    print " $tableau";

  6. #6
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Je suis sous windows, le slash ou l'antislash ne change rien, les 2 fonctionnent.
    J'ai fait un copier coller de ton dernier message et cela fonctionne très bien, le problème vient d'autre part.

    Nb : pour obtenir le nombre d'éléments d'un tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my @repertoires = lister_repertoires_recursif('c:/Perl');
    print " nbr d'éléments : ".@repertoires."\n";

  7. #7
    Membre confirmé Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 58

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Points : 570
    Points
    570
    Par défaut
    Tu peux aussi utiliser le module File::Find (distribué avec Perl). Je te donne un exemple qui fait exactement ce que tu veux (regarde la doc pour plus de détails) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/usr/bin/env perl
    use strict; use warnings;
    use File::Find;
     
    my $start_dir = shift || '.';
    my $nb_of_subdir = 0;
     
    find(\&count, $start_dir);
     
    sub count { $nb_of_subdir++ if -d $File::Find::name}
     
    print $nb_of_subdir - 1 . "\n";
    Le -1 est dû au fait qu'on exclu le répertoire courant.

  8. #8
    Membre confirmé Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 58

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Points : 570
    Points
    570
    Par défaut
    Ah oui, j'oubliais : si pour une raison ou pour une autre – par exemple par souci de voir vraiment comment ça marche – tu préfères ne pas utiliser File::Find, tu peux réecrire une version élémentaire de find.

    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
    #!/usr/bin/env perl
    use strict; use warnings;
     
    my $start_dir = shift || '.';
    my $nb_of_subdir = 0;
     
    find(\&count, $start_dir);
     
    sub custom_find {
      my $routine, my $path = @_;
      opendir my $dir, $path or die "Can't open $path: $!";
      my @subdirs = map { &$routine($_) ; $_ } grep { !/^\.\.?$/ && -d $path/$_ } readdir $dir;
      foreach (@subdirs) { custom_find($routine, "$path/$_") } 
    }
     
    sub count { $nb_of_subdir++ if -d $_}
     
    print $nb_of_subdir - 1 . "\n";
    Tu vois le principe : on passe une routine et un chemin à custom_find qui se charge de parcourir l'arborescence rescursivement en appelant la routine au passage pour chaque entrée trouvée.

    Mais vraiment, je te conseille d'utiliser File::Find, qui fait plus et mieux.

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

Discussions similaires

  1. [XL-2000] Compter le nombre de sous dossier dans un dossier
    Par neno69 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 03/01/2019, 18h53
  2. [XL-2003] Compter le nombre de sous-lignes non vides entre deux colonnes
    Par Augustine1 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 27/07/2012, 14h40
  3. Réponses: 10
    Dernier message: 07/01/2009, 10h20
  4. Réponses: 16
    Dernier message: 26/11/2008, 16h41
  5. Compter le nombre de sous-repertoires
    Par n00bi dans le forum Langage
    Réponses: 3
    Dernier message: 16/07/2004, 12h11

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