Perl compter des fichiers par répertoire

Résolu/Fermé
deniss92 Messages postés 39 Date d'inscription vendredi 3 août 2007 Statut Membre Dernière intervention 15 septembre 2013 - 7 déc. 2008 à 11:08
deniss92 Messages postés 39 Date d'inscription vendredi 3 août 2007 Statut Membre Dernière intervention 15 septembre 2013 - 26 déc. 2008 à 10:38
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);
A voir également:

5 réponses

lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
25 déc. 2008 à 13:17
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
deniss92 Messages postés 39 Date d'inscription vendredi 3 août 2007 Statut Membre Dernière intervention 15 septembre 2013 1
25 déc. 2008 à 11:49
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
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
25 déc. 2008 à 12:19
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
deniss92 Messages postés 39 Date d'inscription vendredi 3 août 2007 Statut Membre Dernière intervention 15 septembre 2013 1
25 déc. 2008 à 13:01
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
deniss92 Messages postés 39 Date d'inscription vendredi 3 août 2007 Statut Membre Dernière intervention 15 septembre 2013 1
26 déc. 2008 à 10:38
Re,

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

Deniss92
0