Posez votre question Signaler

Perl compter des fichiers par répertoire [Résolu]

deniss92 37Messages postés 3 août 2007Date d'inscription 30 novembre 2011Dernière intervention - Dernière réponse le 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);
Lire la suite 

Perl compter des fichiers par répertoire »

5 réponses
Réponse
+2
moins plus
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__
Ajouter un commentaire
Réponse
+0
moins plus
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
Ajouter un commentaire
Réponse
+0
moins plus
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__
Ajouter un commentaire
Réponse
+0
moins plus
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
Ajouter un commentaire
Réponse
+0
moins plus
Re,

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

Deniss92
Ajouter un commentaire
Ce document intitulé « Perl compter des fichiers par répertoire » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?