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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
| #!/usr/bin/perl
use strict;
use warnings;
use utf8;
use autodie;
######*PROGRAMME PRINCIPAL ######
print "\nCe programme parcourt toute l'arborescence d'un dossier que vous allez donner\n";
print "Il va afficher tous les fichiers et les sous-dossiers\n";
print "Pour chaque fichier, on affichera le nom et la taille\n";
print "Pour chaque fichier on recherche la correspondance d'un mot en début de ligne\n";
print "On écrit le résultat dans le fichier Rapport.txt\n\n";
# saisie
print "\n\nQuel dossier ? Entrez le nom complet\n";
my $D = <STDIN>;
chomp $D;
print "\n\nEntrez le mot recherché :\n";
my $M = <STDIN>;
chomp $M;
print "$D - $M\n";
open my $FH_OUT, '>:utf8', './Rapport.txt'; # ouverture du fichier rapport
print $FH_OUT date();
print $FH_OUT "\nDossier : $D - Mot recherché : $M\n\n";;
# traitement
if (-d $D) {
AnalyseDossier ($D);
}
else {
die ("Impossible d'ouvrir le repertoire ",$D);
}
close $FH_OUT;
print "\n\nAu revoir !\n\n";
sub AnalyseDossier {
# La fonction analyseDossier attend un seul paramètre qui est le nom du dossier qu'on veut analyser
my $D= shift; # On recupere le nom du dossier...
# ouverture du dossier $D et creation du descripteur REP
opendir (my $rep, $D) or die ("Impossible d'ouvrir le repertoire ",$D);
# On recupere les fichiers du descripteur REP dans @listFile
# Notez bien que @listFile peut contenir à la fois des dossiers et des fichiers
my @listFile = grep !/^\.{1,2}$/o, readdir ($rep);
# on ferme le descripteur
closedir ($rep);
# Parcours des éléments du dossier $D, ils peuvent $etre des fichiers ou des dossiers
foreach (@listFile) {
# Création du nom complet :
my $nomComplet = $D."/".$_;
# S'il s'agit d'un fichier on le traite via la fonction de traitement
if (-f $_) {
traitement($nomComplet);
next;
}
# sinon s'il s'agit d'un dossier autre que les dossiers . et ..
if (-d $_) {
# ... on lance un nouvel appel récursif à notre fonction, sur ce dossier là :
AnalyseDossier ($nomComplet);
next;
}
} # fin de foreach (@listFile)
} # fin de fonction analyseDossier
sub traitement {
# Ici on se contente d'afficher le nom du fichier et sa taille
# On récupère le paramètre passé à la fonction traitement :
my $nomComplet = shift @_; # c'est le nom complet du fichier
my $taille = -s ($nomComplet);
print $FH_OUT "\n\n$nomComplet : $taille\n";
open my $fh_in, "<:utf8", $nomComplet or die "ouverture impossible de $nomComplet $!"; # ouverture du fichier courant en lecture
while ( <$fh_in> ) { # lecture du fichier courant
if ( /^$M/ ) { # recherche du motif en début de ligne
print $FH_OUT $_;
}
}
close $fh_in; # la fermeture du handle
} # fin de fonction traitement
###############
# Date et Heure
sub date {
my $time = shift || time; #$time par defaut vaut le time actuel
my ( $seconde, $minute, $heure, $jour, $mois, $annee, $jour_semaine, $jour_annee, $heure_hiver_ou_ete )
= localtime($time);
$mois += 1;
$annee += 1900;
# On rajoute 0 si le chiffre est compris entre 1 et 9
foreach ( $seconde, $minute, $heure, $jour, $mois, $annee ) { s/^(\d)$/0$1/; }
return "Le $jour/$mois/$annee à $heure:$minute:$seconde";
} |
Partager