# (gH) -_- alldsc1.txt ; TimeStamp (unix) : 30 Novembre 2005 vers 16:24 $version = "2.35" ; print " alldsc (gH) ; version $version \n" ; ################################################################## ################################################################## # ceci n'est pas un IPOD ! =head1 NAME alldsc : tous les fichiers descriptifs du répertoire =head1 DESCRIPTION ce programme met en forme la liste de tous les fichiers descriptifs du répertoire (fichiers dont l'extension est DSC, en majuscule, minuscule ou mixte) pour le rapport hebdomadaire du comité de direction. =cut ################################################################## ################################################################## use File::stat; use Time::localtime; # pour un affichage 'à la française' sans passer par les "LOCALE" %lstmois = ("Jan","Janvier","Feb","Février","Mar","Mars","Apr","Avril","May","Mai","Jun","Juin", "Jul","Juillet","Aug","Août","Sep","Septembre","Oct","Octobre","Nov","Novembre","Dec","Décembre") ; ################################################################## # y a-t-il eu un paramètre de passé ? if ($#ARGV==-1) { # non ! on le dit et on rappelle la syntaxe avant de sortir print "\n" ; print " Mais... vous n'avez pas indiqué où chercher les fichers descriptifs !\n\n" ; print " La syntaxe est : alldsc LIEU\n\n" ; print " - si vous êtres sous Windows, il faut écrire donc quelque chose comme : \n\n" ; print " alldsc K:\Stat_Ad\ \n\n" ; print " - si vous êtres sous Linux, il faut écrire quelque chose comme : \n\n" ; print " alldsc ~/Cours/Stockage/ \n\n" ; print " - dans les deux cas, pour chercher à l'endroit où vous êtes, il faut écrire : \n\n" ; print " alldsc .\n" ; print "\n" ; exit(-1) ; } ; # fin de si ################################################################## # si nous sommes arrivés ici, c'est qu'il y avait un paramètre : # on le complète éventuellement par le symbole slash pour indiquer qu'il s'agit d'un répertoire $lieu = $ARGV[0] ; if (substr($lieu,-1,1) ne "/") { $lieu .= "/" ; } ; # construction de la liste des fichiers opendir(DSCDIR, $lieu) || die " je ne peux pas ouvrir le répertoire $lieu\n\n"; @listefic = readdir(DSCDIR); closedir DSCDIR; # on passe la liste en revue pour ne retenir que les fichiers dont l'extension # aboutit à dsc en maju, minu ou mixte foreach $idf (@listefic) { push(@lstdsc,"$idf") if ($idf =~ /\.dsc$/i) ; } ; # fin pour idf ################################################################## print "# affichage par ordre alphabétique direct\n" ; # l'instruction suivante (en commentaire) est sans doute plus rapide à l'exécution # foreach $nomfic (sort igncas @lstdsc) { # mais celle-ci est plus explicite : $nbfdsc = 0 ; foreach $nomfic (sort { lc($a) cmp lc($b) } @lstdsc) { &montreFichier(++$nbfdsc,$nomfic) ; } ; # fin pour $nomfic ################################################################## print "# affichage par age décroissant \n" ; # on complète chaque nom de fichier avec le lieu # et on stocke devant la date en jours ; pour éviter # les ex-aequo, on ajoute le nom du fichier en bout de date # ce qui produit une table de hachage foreach $x (@lstdsc) { $laclef = -M "$lieu$x" ; $laclef .= $x ; $lstdat{ $laclef } = $x ; } ; # fin de pour chaque # affichage trié : il ne faut pas oublier de # forcer le tri en numérique à cause des noms # de fichier en bout de date. $nbfdsc = 0 ; foreach $datfic (sort { $b <=> $a } keys %lstdat) { &montreFichier(++$nbfdsc,$lstdat{$datfic}) ; } ; # fin de tant que sur datfic # sortie normale du programme exit(0) ; ############################################################### ############################################################### # sous programme pour bien afficher les fichiers sub montreFichier { local ($numf,$nomf) = @_ ; print sprintf(" %3d. %-25s ",$numf,uc($nomf)).&ageFichier($nomf,$ilieu)." $nomf\n" ; } ; # fin sub # gestion de l'age du fichier # http://www.perl-gratuit.com/traduction/docfr/perllocale.html sub ageFichier { local ($nomf,$mlieu) = @_ ; $agefichier = ctime(stat("$lieu$nomf")->mtime) ; @ageinfos = split(/\s+/,$agefichier) ; $jour = sprintf("%3d",$ageinfos[2]) ; $mois = sprintf("%-10s",$lstmois{$ageinfos[1]}) ; $an = $ageinfos[4] ; $agelisible = "$jour $mois $an" ; return($agelisible) ; } ; # fin sub # fonction de tri pour les noms de fichier # on IGNore la CASse majuscule ou minuscule sub igncas { lc($a) cmp lc($b) } ;