Rechercher : dans
Par :

Perl compter des fichiers par répertoire

Dernière réponse le 26 déc 2008 à 10:38:53 deniss92, le 7 déc 2008 à 11:08:36 
 Signaler ce message aux modérateurs

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

Meilleures réponses pour « Perl compter des fichiers par répertoire » dans :
Perl - Les fichiers Voir La notion de filehandle On appelle filehandle (traduisez descripteur de fichier), dans un programme Perl, le nom permettant de manipuler une connexion d'entrée-sortie (les entrées-sorties standards vues précédemment sont connues par les filehandles...
[MS-Dos] Lister le contenu d'un répertoire dans un fichier VoirIl peut s'avérer pratique d'effectuer le listage d'un ou plusieurs répertoires dans un fichier, afin de tenir par exemple un catalogue de fichiers. Sous MS-Dos (ou sous Windows en ouvrant une fenêtre d'invite de commande MS-Dos) il est possible...
[Windows] Obtenir la liste des fichiers d'un dossier VoirLister le contenu d'un dossier Voici une astuce simple qui permet de lister le nom des fichiers contenus dans un répertoire. Vous pourrez obtenir en un clic les titres de vos chansons, de vos photos, etc. dans un fichier...
Vider le dossier prefetch pour accélérer Windows VoirMythe Il est utile de purger régulièrement le dossier prefetch: Cela accélère Windows. Réalité FAUX. Explications Il faut bien comprendre à quoi sert le dossier prefetch (C:\WINDOWS\Prefetch): Lorsque vous lancez un programme, il fait:...
Fichiers et répertoires VoirLes fichiers sous DOS Sur un ordinateur les informations sont stockées dans des fichiers. Lorsqu'on exécute un programme, MS-DOS traite les informations situées dans le fichier et les transmet au système. Sous MS-DOS chaque fichier peut être aussi...
Mise en place de Samba sous Linux VoirIntroduction Un des principaux intérêts des réseaux est la possibilité de partager des fichiers. Il existe des protocoles (notamment le FTP, File Transfert Protocol) permettant de transférer des fichiers à l'aide de commandes à travers un réseau...
Partage de fichiers sous Windows XP VoirIntérêt Le partage de fichiers consiste à rendre disponible à travers le réseau le contenu d'un ou plusieurs répertoires. Tous les systèmes Windows possèdent en standard des mécanismes permettant de mettre facilement en partage le...

1

deniss92, le 25 déc 2008 à 11:49:23

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

Répondre à deniss92

2

lami20j, le 25 déc 2008 à 12:19:03

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__
106485010510997108

Répondre à lami20j

3

deniss92, le 25 déc 2008 à 13:01:52

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

Répondre à deniss92

4

lami20j, le 25 déc 2008 à 13:17:31
  • +2

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__
106485010510997108

Répondre à lami20j

5

 deniss92, le 26 déc 2008 à 10:38:53

Re,

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

Deniss92

Répondre à deniss92