Perl compter des fichiers par répertoire

Résolu
deniss92 Messages postés 41 Statut Membre -  
deniss92 Messages postés 41 Statut Membre -
Bonjour,

J'ai fait un script en perl qui compte le nombre de fichiers dans le sous-repertoire courant. Je cherche à savoir, il ya un moyen de faire un comptage par type de fichiers (*.jpg, par exemple) de façon récursive par sous répertoire depuis le répertoire racine ( ici le réperoire racine est "/datas/docs").
Exemple d'affichage pour les jpg :

/datas/docs
Archives 1000
photos 100
divers 500

Mon script ne permet pas de résoudre le problème concernant les répertoires qui contiennent l'expression jpg ou pdf dans leurs noms.

Merci d'avance

---------------------------------------------------------------------------------------------
Mon script

#!/usr/bin/perl
use CGI qw(:standard :html3);

$cgi = new CGI;
($sec, $min, $heure, $jour, $mois,$annee, undef, undef, undef) = localtime();
$mois += 1 and $annee += 1900;
$date=$jour.'-'.$mois.'-'.$annee;
my (@tab,%hash);

# Repertoire Archives
$arch_jpg=(`ls -R /datas/docs/archives|grep jpg|wc -l`+`ls -R /datas/docs/archives|grep JPG|wc -l`);
$arch_pdf=(`ls -R /datas/docs/archives|grep PDF| wc -l`+`ls -R /datas/docs/archives|grep pdf| wc -l`);

#Repertoire photos
$photos=(`ls -R /datas/docs/photos|grep jpg|wc -l`+`ls -R /datas/docs/photos|grep JPG|wc -l`);

#Divers
$divers_jpg=(`ls -R /data/documents/divers|grep jpg|wc -l`+`ls -R /data/documents/divers|grep JPG|wc -l`);
$divers_pdf=(`ls -R /data/documents/divers|grep PDF|wc -l`+ `ls -R /data/documents/divers|grep pdf|wc -l`);

#Totaux
$jpg = ($arch_jpg+$photos+$divers_jpg);
$pdf=($arch_pdf+$divers_pdf);

%hash=("Archives (pdf)"=>$arch_pdf, "Archives (jpg)"=>$arch_jpg,"Photos"=>$photos "Divers(jpg)"=>$divers_jpg, "Divers (pdf)"=>$divers_pdf,
"Total (jpg)"=>$jpg,"Total (pdf)" =>$pdf);
#%table=%h;
push @tab,\%hash;

print
$cgi->header() .
$cgi->start_html (
-title=>'Nombre de docs',
-author=>'xxxxx',
-meta=>{'keywords'=>'CGI Perl'},
-BGCOLOR=>'white',
-LINK=>'red',
-charset=>'UTF-8',

).
$cgi->h3('Nombre de docs - '.$date) . "\n";
#print '<TABLE border="1" cellspacing="2" cellpadding="2">' . "\n";
print $cgi->table({border=>1,width=>'20%'}) . "\n";
print $cgi->Tr(th[qw(docs Nombres)]);
foreach (@tab){
foreach my $k(sort keys %{$_}){
print $cgi-> Tr(td($k),td({align=>"right"},$_->{$k})),"\n";
}
}
print "</TABLE>";
$cgi->end_html ;
exit (0);
Configuration: Linux Fedora
Firefox 2.0.0.18

5 réponses

  1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Re,

    Voici une autre version qui t'afficheras le total par répertoire ainsi que le total de la racine de recherche
    #!/usr/bin/perl
    use strict;use warnings;
    use File::Find;
    
    my ($n,$total,$rep,$racine);
    $racine = "/home/lami20j/";
    opendir(REP,$racine);
    
    sub recherche {
     ++$n if $File::Find::name =~ /\.pl/;
    }
    
    while(defined($rep=readdir REP)){
      if (-d "${racine}$rep" and $rep !~ /^\..?$/){
        find(\&recherche,"${racine}$rep");
        print "${racine}$rep : $n\n" if $n!=0;
        $total += $n;
        $n=0;
      }
    }
    print "$racine : $total\n";
    
    __END__
    
    2
  2. deniss92 Messages postés 41 Statut Membre 1
     
    Re

    Voici la version allégée de mon script de départ. Je l'ai décompsé en deux fonctions. Je n'ai pas pu faire la même chose en utilisant "file find", car il affiche les sous répertoires où se trouvent les fichiers dans l'aborescence, alors que le but est de compter les fichiers de type "*.jpg" et *.pdf" et d'afficher le nombre total par répertoire principal. C'est surement possible avec "file find", mais je n'ai pas pu trouver comment masquer les sous-répertoires.

    #!/usr/bin/perl
    use CGI qw(:standard :html3);

    $cgi = new CGI;
    ($sec, $min, $heure, $jour, $mois,$annee, undef, undef, undef) = localtime();
    $mois += 1 and $annee += 1900;
    $date=$jour.'-'.$mois.'-'.$annee;
    $racine = "/data/docs/"; # répertoire racine ...
    @rep=qw(archives photos divers);# listes des répertoires à afficher
    %hash;
    sub jpg {
    for (my $i=0;$i<=$#rep;$i++) {
    my $chemin=$racine.$rep[$i];
    my $nombre_jpg=(`ls -R $chemin|grep -i jpg|wc -l`);
    my $rep_jpg=$rep[$i]."(jpg)";
    push @{$hash{$rep_jpg}}, $nombre_jpg;
    }
    }

    sub pdf {
    for (my $i=0;$i<=$#rep;$i++) {
    my $chemin=$racine.$rep[$i];
    my $nombre_pdf=(`ls -R $chemin|grep -i pdf|wc -l`);
    my $rep_pdf=$rep[$i]."(pdf)";
    push @{$hash{$rep_pdf}}, $nombre_pdf;
    }
    }
    jpg();
    pdf();
    push @tab,\%hash;

    $\="\n";
    #affichage en CGI
    print
    $cgi->header() .
    $cgi->start_html (
    -title=>'Nombre de documents',
    -author=>'xxxx',
    -meta=>{'keywords'=>'CGI Perl'},
    -BGCOLOR=>'white',
    -LINK=>'red',
    -charset=>'UTF-8',

    ).
    $cgi->h1('Nombre de documents - '.$date) . "\n";
    #print '<TABLE border="1" cellspacing="2" cellpadding="2">' . "\n";
    print $cgi->table({border=>1,width=>'20%'}) . "\n";
    print $cgi->Tr(th[qw(Documents Nombres)]);
    foreach (@tab){
    foreach my $k(sort keys %{$_}){
    print $cgi-> Tr(td($k),td({align=>"right"},$_->{$k})),"\n";
    }
    }
    print "</TABLE>";
    $cgi->end_html ;
    exit (0);

    ------------------------------------------------------------------------------------------------------FIN DU SCRIPT

    A bientot

    Deniss92
    0
  3. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    Compliqué ton script ;-)

    Par exemple pour compter le nombre de fichiers .jpg d'un répertoire (attention, la recherche sera récursive = il va chercher aussi dans les sous-répertoires, etc.)
    #!/usr/bin/perl
    use strict;use warnings;
    use File::Find;
    
    my $n;
    
    sub recherche {
     if (-f){++$n if $File::Find::name =~ /\.jpg/;}
    }
    
    find(\&recherche,"/chemin/vers/repertoire");
    print "$n\n";
    __END__
    
    0
  4. deniss92 Messages postés 41 Statut Membre 1
     
    Bonjour Lami20j

    Si tu veux afficher les répertoires , il va aussi t'afficher les sous répertoires sans agréger le total par répertoire, je crois. Je vais tester pour voir.

    A bientôt

    Deniss92
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. deniss92 Messages postés 41 Statut Membre 1
     
    Re,

    La dernière version est mieux.
    Merci et à bientôt.

    Deniss92
    0